#utf-8
Вопрос:
Учитывая срез байтов, который является допустимым utf8, верно ли, что любой срез такого среза также допустим utf8
?
Другими словами, учитывая b1: [u8]
, что это действительно utf8
так, могу ли я предположить, что
b2 = b1[i..j]
допустима ли utf8 для любого i,j : i<j
?
Если нет, то каков был бы встречный пример?
Комментарии:
1. нет? Так
π
в шестнадцатеричномcf80
, так что, если вы срезаетеcf
и80
, оба недопустимы. (?)sub-slice of such slice
Выполняется ли нарезка на границах байтов ?2. Да, правильный ответ. По какой-то причине я думал о сложных примерах. Не могли бы вы преобразовать его в ответ?
3. В основном правило состоит в том, чтобы вырезать только перед однобайтовым символом (т. Е. <= 0x7F) или начальным байтом (>= 0x80 amp;amp; > Тогда правильность будет сохранена (т. Е. результат все равно может быть неверным, если ввод неверен). Обратите внимание, что при этом сохраняется только правильность кодировки UTF-8. Сокращение строк Юникода после произвольных кодовых точек Юникода может легко привести к бессмысленным строкам (например, сокращение между символом и его кодовыми точками-модификаторами).
4. Одной из основных особенностей UTF-8 является синхронизация: в любом заданном байте можно прочитать всего несколько байтов, чтобы затем определить, с какого момента начинается новый символ. Что также означает, что сокращение в любом месте приведет к появлению байтов, которые больше не синхронизируются. Метод, который является/был распространен в MPEG, ISDN и многих других системах уже на протяжении десятилетий.
Ответ №1:
каков был бы встречный пример?
Любая кодовая точка, кодирующая более 1 байта. Например π
, в шестнадцатеричном cf80
формате, и разрезание его посередине создает две (отдельные) недопустимые строки UTF-8.