Разделитель строк UTF-8

#utf-8

#utf-8

Вопрос:

Я анализирую двоичный протокол, в котором строки UTF-8 чередуются с необработанными байтами. Этот конкретный протокол предваряет каждую строку UTF-8 коротким символом (два байта), указывающим длину следующей строки UTF-8. Это дает максимальную длину строки 2 ^ 16 > 65 000, что более чем достаточно для конкретного приложения.

Мой вопрос в том, является ли это стандартным способом разграничения строк UTF-8?

Комментарии:

1. если у вас уже есть длина, зачем вам разделитель?

Ответ №1:

Я бы не назвал это разделением, скорее «префиксом длины». Некоторые люди называют их строками Pascal, поскольку в первые дни язык Pascal был одним из популярных, который таким образом сохранял строки в памяти.

Я не думаю, что существует формальный стандарт специально для этого, поскольку это довольно очевидный способ хранения строк UTF-8 (или любых строк в байтах, если уж на то пошло). Однако он определяется снова и снова как часть многих стандартов, которые имеют дело с сообщениями, содержащими строки.

Комментарии:

1. Да, я был слишком вольным в использовании термина «разделитель» — я заменил его термином «префикс длины», поскольку в данном случае они выполняют эквивалентную функцию, но разделитель действительно относится только к завершающему символу. «Определяется снова и снова» — это то, что я хотел услышать 🙂 Спасибо!

Ответ №2:

Обычно UTF8 не имеет ограничений, вы должны быть в состоянии определить многобайтовые символы в нем, используя правила, упомянутые здесь:http://en.wikipedia.org/wiki/UTF-8#Description

Ответ №3:

я бы использовал разделитель, который начинается с 0x11 …… но если вы отправляете необработанные байты, вам придется исключить этот разделитель из обрабатываемых данных сообщений, это означает, что если есть пользовательский ввод, аналогичный этому разделителю, вам придется преобразовать его.

если пользователь вводит любой символ, представленный в формате utf8, вы можете просто отправить его как есть.