为什么Java使用修改后的UTF-8而不是UTF-8?

时间:2013-03-15 19:26:08

标签: java unicode utf-8 java-native-interface

为什么Java使用modified UTF-8而不是标准的UTF-8进行对象序列化和JNI?

一种可能的解释是,修改后的UTF-8不能嵌入空字符,因此可以使用以空终止字符串操作的函数。还有其他原因吗?

3 个答案:

答案 0 :(得分:9)

处理补充字符更快更简单(不处理它们)。

Java将字符表示为16位char,但unicode已演变为包含超过64K字符。因此,一些字符,即补充字符,必须在Java中以2 char s(代理对)编码。

严格的UTF-8要求编码器将代理项对转换为字符,然后将字符编码为字节。解码器需要将补充字符拆分回代理对。

chars -> character -> bytes -> character -> chars

由于两端都是Java,我们可以采用一些快捷方式并直接在char级别

进行编码
char -> bytes -> char

编码器和解码器都不需要担心代理对。

答案 1 :(得分:1)

我怀疑这是主要原因。在C盘中,不得不处理字符串可能包含嵌入式NUL会使事情变得复杂。

答案 2 :(得分:1)

Unicode Explained - Page 306中对修改过的UTF-8有一个很好的描述,但它没有解释为什么决定修改后的UTF-8。

Java自己的文档中还有一个非常详细的解释,说明如何最初将非BMP Unicode字符的支持添加到Java:Supplementary Characters in the Java Platform。但同样,没有解释为什么为什么修改了UTF-8。

除非你直接询问Java的架构师,否则我认为你不会找到为什么