UTF-8可以包含零字节吗?

UTF-8字符串可以包含零字节吗?我要把它发送到 ASCII 明文协议,我应该用 Base64之类的东西来编码吗?

36684 次浏览

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/