UTF-8字符串可以包含零字节吗?我要把它发送到 ASCII 明文协议,我应该用 Base64之类的东西来编码吗?
ASCII 文本仅限于0到127之间的字节值。UTF-8文本没有这样的限制-用 UTF-8编码的文本可能有其高位集。因此,通过不能保证高位安全通过的通道发送 UTF-8文本是不安全的。
如果您被迫处理一个仅 ASCII 通道,Base-64是一个合理的(尽管不是特别节省空间)选择。但是,您确定仅限于7位数据吗?这在今天有点不寻常。
是的,UTF8中的0字节是代码点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 字符的 所有表示为它们自己,而所有多字节序列的所有字节中都有一个高位1。
您可能需要小心,您的 ascii 明文协议不会对非 ASCII 字符处理不当(因为那将是 所有非 ASCII 代码点)。
UTF-8编码的字符串可以在给定的字节位置上具有从0x00到0xff 的大多数值,用于支持内存(尽管一些特定的组合是不允许的,参见 http://en.wikipedia.org/wiki/UTF-8和八位组值 C0,C1,F5到 FF 从不出现)。
如果要通过诸如不支持二进制数据的 ASCII 流之类的通道进行传输,则必须进行适当的编码。Base64受到广泛支持,并且肯定会解决这个问题,尽管它不是完全有效,因为它使用64个字符空间来编码数据,而 ASCII 允许128个字符空间。
有一个 source ceforge 项目提供了基本的91编码,这种编码更加节省空间,同时避免了不可打印的字符 http://base91.sourceforge.net/