12

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

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

4

3 回答 3

9

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

Java 将字符表示为 16 位char,但 unicode 已经发展到包含超过 64K 的字符。所以一些字符,补充字符,必须char在 Java 中以 2 s(代理对)编码。

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

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

由于两端都是Java,我们可以走一些捷径,直接在char关卡上编码

char -> bytes -> char

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

于 2013-03-15T20:57:55.337 回答
1

我怀疑这是主要原因。在 C 语言中,必须处理包含嵌入 NUL 的字符串会使事情复杂化。

于 2013-03-15T19:28:41.810 回答
1

在Unicode Explained - Page 306中有对 Modified UTF-8 的很好描述,但它没有解释为什么决定使用 Modified UTF-8。

Java 自己的文档中也有一个非常详细的解释,说明了对非 BMP Unicode 字符的支持最初是如何添加到 Java中的:Java 平台中的补充字符。但同样,没有解释为什么决定使用 Modified UTF-8。

我认为除非您直接询问 Java 架构师,否则您不会找到原因。

于 2013-03-16T18:56:54.570 回答