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

ein*_*ude 55 unicode

UTF-8字符串可以包含zerobytes吗?我将通过ascii明文协议发送它,我应该用base64编码吗?

pax*_*blo 79

是的,UTF8中的零字节是代码点0,NUL.有没有将在UTF8与内任何地方一个零字节编码其他Unicode代码点.

可能的代码点及其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
Run Code Online (Sandbox Code Playgroud)

您可以看到所有非零ASCII字符都表示为自身,而所有多字节序列的所有字节都具有高位1.

您可能需要注意ascii明文协议不会严重处理非ASCII字符(因为这将是所有非ASCII代码点).

  • Pacerier,没有_invalid_ UTF8这样的东西.根据定义,如果它无效,则不是UTF8 :-) (7认同)
  • UTF-8的定义过多地意味着"将字节解释为UTF-8"而不是原始的"根据UTF-8的字节". (3认同)
  • @gardarh:不,0x0800的UTF-8编码不是"08,00",它是`e0,a0,80`,看不到零字节.有关详细信息,请参阅http://www.fileformat.info/info/unicode/char/0800/index.htm,但它基本上是答案中我的第三个范围中的第一个值,*所有*字节都设置了高位,因此没有'00`的可能性. (3认同)
  • Pacerier,你提出了一个好点,可能就是这样,但那时它们只是_wrong._错误,因为试图声称EBCDIC的人是ASCII,COBOL是C,或法语是斯瓦希里语:-)我可以看到_no_合理的解释如果根据UTF8规则实际上没有效果,则会调用UTF8.如果它不是_valid_ UTF8,那么它只是某种任意的字节流. (2认同)