Нужна ли для кодировки utf-8 длина символа? - PullRequest
0 голосов
/ 27 февраля 2019

Из того, что я понимаю, случайные реализации двоичной сериализации нестатических структур (например, массива или вектора) обычно указывали бы "длину" структуры как первое слово (обычно 64-битный uint),затем приступим к кодированию значения каждой сущности без разделителей (учитывая, что сериализованные данные субъекта в каждой ячейке массива являются детерминированными, поэтому двоичному анализатору не требуется никакого предварительного просмотра или обратного отслеживания).

Будет ли это поведението же самое, традиционно, для строк utf-8?Я не вижу другого способа реализации двоичной сериализации для «неограниченных» строк utf-8, чтобы парсер не нуждался в возврате (что может быть действительно неэффективно) или в ожидании (что также потребовало бы чрезмерного тестирования на различные возможности).тоже неэффективно).Я предполагаю, что значение "length" будет обозначать количество символов, а не количество байтов, поскольку кодировка utf-8 варьируется от 1 до 4 байтов для каждого символа, хотя сама кодировка указывает, сколько байтов существует в символена основе первого байта (исключая обратное отслеживание и прогнозирование для каждого символа).

Например, поток октетов для строки abc будет

[0,0,0,0,0,0,0,3,97,98,99]

, где 0,0,0,0,0,0,0,3обозначает длину введенной строки в uint64, abc.

Правильно ли понимаешь моя интуиция или я что-то упускаю?

1 Ответ

0 голосов
/ 28 февраля 2019

В UTF-8 кодовая точка Unicode U + 0000 (NUL) кодируется как один байт значения ноль.Это не происходит при кодировании любой другой кодовой точки в UTF-8, поэтому строка байтов с нулевым символом в конце может использоваться без предшествующей длины, если в последовательности не разрешен встроенный NUL;В противном случае можно использовать предыдущую длину, как показано в вопросе.

Например, строка Unicode "abcdéfg一二三四" кодируется как шестнадцатеричные байты:

61 62 63 64 c3 a9 66 67 e4 b8 80 e4 ba 8c e4 b8 89 e5 9b 9b 00
a  b  c  d  é     f  g  一       二       三       四        ␀

UTF-8 не нуждается в возврате или заглядывании назад, так как начальный байт последовательности указывает количество конечных байтов, необходимое для кодовой точки:

61 hex = 0 1100001 bin (однобайтовая последовательность)
c3 hex = 110 00011 bin (двухбайтовая последовательность)
e4 hex = 1110 0100 bin (трехбайтовая последовательность)

Конечные байты начинаются с 10 xxxxxx bin :

a9 hex = 10 101001 bin (конечный байт)
b8 hex = 10 111000 bin (конечный байт)
80 hex = 10 000000 bin (конечный байт)

...