UTF-8可以包含零字节吗?
UTF-8string是否包含零字节? 我打算通过ASCII明文协议发送它,我应该用base64这样的东西编码吗?
是的,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字符都表示为自己,而所有多字节序列的所有字节都具有高位1。
您可能需要小心,您的ASCII明文协议不会严重对待非ASCII字符(因为这将是所有非ASCII码点)。
一个UTF-8编码的string可以在后备存储器的给定字节位置中具有从0x00到0xff的大部分值(尽pipe一些特定的组合是不允许的,参见http://en.wikipedia.org/wiki/UTF-8和八位字节值C0,C1,F5到FF不会出现)。;
如果您通过不支持二进制数据的ASCII码stream等频道进行传输,则必须进行适当的编码。 Base64得到了广泛的支持,并且一定会解决这个问题,尽pipe它不是完全有效的,因为它使用64个字符的空间来编码数据,而ASCII允许128个字符的空间。
有一个sourceforge项目,提供基地91编码,这是更多的空间效率,同时避免不可打印的字符http://base91.sourceforge.net/
ASCII文本被限制在0到127之间的字节值。UTF-8文本没有这样的限制 – 用UTF-8编码的文本可能具有其高位设置。 所以发送UTF-8文本到不能保证安全通过的频道是不安全的。
如果你不得不处理一个纯ASCII的通道,Base-64是一个合理的(虽然不是特别节省空间的)select。 你确定只限于7位数据吗? 这在今天有点不寻常。