Java UTF-8的区别

Pro*_*ica 8 java utf-8

JavaDoc说"空字节'\ u0000'以2字节格式而不是1字节编码,因此编码的字符串永远不会嵌入空值."

但这甚至意味着什么呢?在这种情况下,什么是嵌入式null?我试图从Java保存的UTF-8字符串转换为"真正的"UTF-8.

Tho*_*sen 16

在C中,字符串由字节值00终止.

这里的事情是你可以在Java字符串中使用0-chars但是为了避免在将字符串传递给C(所有本地方法都写入)时出现混淆,字符以另一种方式编码,即作为两个字节

11000000 10000000
Run Code Online (Sandbox Code Playgroud)

(根据javadoc)这两者实际上都不是00.

这是一个解决你无法轻易改变的事情的黑客.

另请注意,这是有效的UTF-8并正确解码为00.

  • @Amigable:更清楚:在版本3.1之前它是合法的UTF-8.从3.1开始,每个字符必须以尽可能短的形式编码.在Unicode标准的当前版本6.0(http://www.unicode.org/versions/Unicode6.0.0/,章节*一致性*)中,第93页的UTF-8定义中也提到了这一点.(映射到代理的UTF-8序列也无效). (5认同)
  • 我不确定*这是有效的UTF-8* - 天真的解码器会将其解码为0,但[RFC 3629](http://tools.ietf.org/html/rfc3629#page-5)清楚地说:*上述解码算法的实现必须防止解码无效序列.例如,天真的实现可以将超长UTF-8序列C0 80解码为字符U + 0000 [...]. (2认同)
  • 它不是0的最短编码,但它解码为0. (2认同)
  • 还有其他语言也使用它.我知道Tcl会这样做,我会假设还有更多. (2认同)