Может ли UTF-8 содержать нулевой байт? - PullRequest
53 голосов
/ 02 августа 2011

Может ли строка UTF-8 содержать нули? Я собираюсь отправить его по незашифрованному текстовому протоколу ascii. Должен ли я его кодировать с помощью base64?

Ответы [ 3 ]

76 голосов
/ 02 августа 2011

Да, нулевой байт в UTF8 - это кодовая точка 0, NUL.Существует нет другой кодовой точки Unicode, которая будет кодироваться в UTF8 с нулевым байтом где-либо внутри него.

Возможные кодовые точки и их кодировка UTF8:

Range              Encoding  Binary value
-----------------  --------  --------------------------
U+000000-U+00007f  0xxxxxxx  0xxxxxxx

U+000080-U+0007ff  110yyyxx  00000yyy xxxxxxxx
                   10xxxxxx

U+000800-U+00ffff  1110yyyy  yyyyyyyy xxxxxxxx
                   10yyyyxx
                   10xxxxxx

U+010000-U+10ffff  11110zzz  000zzzzz yyyyyyyy xxxxxxxx
                   10zzyyyy
                   10yyyyxx
                   10xxxxxx

Вы можете видеть, что все ненулевые символы ASCII представляются как они сами, в то время как все последовательности mutibyte имеют старший бит 1 во всех своих байтах.

Возможно, вам следует быть осторожнымчто ваш открытый текстовый протокол ascii не плохо обрабатывает символы не-ASCII (поскольку это будет все не-ASCII кодовые точки).

3 голосов
/ 02 августа 2011

Строка в кодировке UTF-8 может иметь большинство значений от 0x00 до 0xff в заданной позиции байта для резервной памяти (хотя некоторые конкретные комбинации недопустимы, см. http://en.wikipedia.org/wiki/UTF-8 и значения октетов C0, C1От F5 до FF никогда не появляются).

Если вы транспортируете по каналу, такому как поток ASCII, который не поддерживает двоичные данные, вам придется соответствующим образом кодировать.Base64 широко поддерживается и, безусловно, решит эту проблему, хотя он не совсем эффективен, поскольку для кодирования данных используется пространство из 64 символов, а ASCII позволяет использовать пространство из 128 символов.

Существует проект sourceforge, который обеспечивает кодировку base 91, которая более экономична, избегая непечатных символов http://base91.sourceforge.net/

2 голосов
/ 02 августа 2011

Текст ASCII ограничен байтовыми значениями от 0 до 127. Текст UTF-8 не имеет такого ограничения - текст, закодированный с помощью UTF-8, может иметь свой старший бит.Поэтому небезопасно отправлять текст UTF-8 по каналу, который не гарантирует безопасного прохождения для этого старшего бита.

Если вы вынуждены иметь дело с каналом только для ASCII, Base-64 - эторазумный (хотя и не особенно компактный) выбор.Вы уверены, что ограничены 7-битными данными?Это несколько необычно в этот день.

...