UTF-8字符串是否包含zerobytes?我将通过ascii明文协议发送它,我应该用base64编码吗?
答案 0 :(得分:75)
是的,UTF8中的零字节是代码点0,NUL。 no 其他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代码点)。
答案 1 :(得分:3)
对于后备内存,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/
答案 2 :(得分:2)
ASCII文本限制为0到127之间的字节值.UTF-8文本没有这样的限制 - 用UTF-8编码的文本可能设置了高位。因此,通过一个不保证高位安全通过的通道发送UTF-8文本是不安全的。
如果你被迫处理一个只有ASCII的通道,Base-64是一个合理的(虽然不是特别节省空间)的选择。你确定你只限于7位数据吗?这一天有点不寻常。