Unicode UTF-8是否可以包含零字节?

Unicode UTF-8是否可以包含零字节?,unicode,Unicode,UTF-8字符串是否可以包含零字节?我将通过ascii明文协议发送它,我是否应该用base64之类的代码对它进行编码?ascii文本限制为0到127之间的字节值。UTF-8文本没有这样的限制-使用UTF-8编码的文本可以设置其高位。因此,通过无法保证高比特安全通过的通道发送UTF-8文本是不安全的 如果您被迫处理仅ASCII的通道,Base-64是一个合理的选择(尽管不是特别节省空间)。但是,您确定您仅限于7位数据吗?这在今天有些不寻常。是的,UTF8中的零字节是代码点0,NUL。没有其他Uni

UTF-8字符串是否可以包含零字节?我将通过ascii明文协议发送它,我是否应该用base64之类的代码对它进行编码?

ascii文本限制为0到127之间的字节值。UTF-8文本没有这样的限制-使用UTF-8编码的文本可以设置其高位。因此,通过无法保证高比特安全通过的通道发送UTF-8文本是不安全的


如果您被迫处理仅ASCII的通道,Base-64是一个合理的选择(尽管不是特别节省空间)。但是,您确定您仅限于7位数据吗?这在今天有些不寻常。

是的,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编码字符串在给定的字节位置可以具有0x00到0xff之间的大多数值,以用于备份内存(尽管不允许使用一些特定的组合,但请参阅,并且八位字节值C0、C1、F5至FF从未出现)

如果您要通过不支持二进制数据的ASCII流这样的通道进行传输,则必须进行适当的编码。Base64受到广泛支持,肯定会解决这个问题,但它并不完全有效,因为它使用64个字符的空间来编码数据,而ASCII允许128个字符的空间。


有一个sourceforge项目提供base 91编码,它在避免不可打印字符的同时更节省空间

UTF-8使用8位,因此您无法通过ASCII(7位)发送它纯文本.Base64编码会有帮助。但不是因为空字节。我认为你的第一句话不正确。序列
1111111 0
只能出现在七个单位的序列中,我认为没有指定,而且据我所知,
11111111
永远不会出现。(这是怎么回事?可能是假设扩展到七个以上的代码单元?)你可以在ASCII或UTF-8通道上使用base-128,效率更高:你的第一句话不正确。根据(2003-11年发布的互联网标准)的第2页,“八位组值C0、C1、F5到FF从未出现。”@Rhymoid:谢谢,我不知道。知道为什么吗?相应地更新了我的答案。@EricJ.C0和C1是无效的,因为它们是过长UTF-8序列的一部分(因其安全性而被禁止;例如,如果允许,序列
[C0 80]
将编码U+0000),F5到FD无效,因为它们编码无效的码点(最高有效码点为U+10FFFF,使所有序列的长度最多为4个八位字节),以及FE和FF在UTF-8中是不允许的。您可以使用base-128在仅UTF-8/ASCII的通道中处理二进制数据,因为较低的128字节值都是单字节代码点,好吧。Pacerier,没有无效的UTF8。根据定义,如果它无效,则不是UTF8:-)UTF-8的定义太多了,以至于“字节被解释为UTF-8”而不是原来的“根据UTF-8的字节”。Pacerier,你提出了一个很好的观点,这可能是事实,但他们只是错了。就像那些试图声称EBCDIC是ASCII、COBOL是C或French是斯瓦希里语的人一样错误:-)我看不出任何合理的解释,如果根据UTF8规则,某个东西实际上是无效的,那么它将被称为UTF8。如果它不是有效的UTF8,那么它只是某种任意的ByTestStream。一个程序处理一个声称是UTF-8的字节流的可能性(严格地说)远远大于一个巴黎人在肯尼亚要求一块巧克力。虽然两者都有可能,但前者在编写代码时值得考虑。@gardarh:不,0x0800的UTF-8编码不是
08,00
,而是
e0,a0,80
,看不到零字节。有关更多详细信息,请参阅,但它基本上是答案中第三个范围的第一个值,所有字节都设置了高位,因此不可能出现
00