Может ли UTF-8 содержать нулевой байт?
может ли строка UTF-8 содержать нуль-байты? Я собираюсь отправить его по протоколу ascii plaintext, должен ли я кодировать его с помощью чего-то вроде base64?
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-битными данными, хотя? Это несколько необычно в этом день.