Может ли UTF-8 содержать нулевой байт?


может ли строка UTF-8 содержать нуль-байты? Я собираюсь отправить его по протоколу ascii plaintext, должен ли я кодировать его с помощью чего-то вроде base64?

3 51

3 ответа:

да, нулевой байт в 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 plaintext не обрабатывает символы, отличные от ASCII, плохо (так как это будет все не-ASCII коды).

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

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

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

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

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