UTF-8字符串能包含零字节吗?我将通过ASCII纯文本协议发送它,我应该使用类似base64的编码进行编码吗?
UTF-8字符串能包含零字节吗?我将通过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码点)。
08, 00
,而是e0, a0, 80
,完全没有零字节。可以参考http://www.fileformat.info/info/unicode/char/0800/index.htm了解更多细节,但基本上它是答案中第三个范围内的第一个值,*所有*字节都具有高位设置,因此不存在`00`的可能性。 - paxdiablo\xC0\x80
。使用修改过的UTF-8,空字节永远不会出现在编码文本中,因此可以安全地使用空字节来表示编码文本流的结束。(然而,我怀疑UTF-8 - 修改过或未修改过 - 是否能够在OP想要的ASCII纯文本协议上生存下来。第8位有点重要!) - Ted HoppUTF-8编码的字符串在给定的字节位置上可以有0x00到0xff之间的大多数值(尽管一些特定的组合不被允许,参见http://en.wikipedia.org/wiki/UTF-8和八位字节值C0、C1、F5到FF从未出现)。
如果你要通过ASCII流等不支持二进制数据的通道进行传输,则需要适当地进行编码。Base64得到广泛支持,并且肯定会解决这个问题,尽管它并不完全有效,因为它使用了一个包含64个字符的空间来编码数据,而ASCII则允许128个字符的空间。
有一个sourceforge项目提供了base91编码,它更加高效地利用空间,同时避免了非可打印字符http://base91.sourceforge.net/
11111110
只能出现在七个单位的序列中,我认为这并没有被指定,而据我所知,11111111
永远不可能出现。(它怎么可能出现呢?也许在超过七个代码单元的假设扩展中?) - Kerrek SB[C0 80]
将编码U+0000),F5到FD是无效的,因为它们编码了无效的代码点(最高有效代码点是U+10FFFF,使所有序列长度最多为4个八位字节),FE和FF在UTF-8中从未被允许。 - user824425