Являются ли байтовые фрагменты utf8 также utf8?

#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.