问题 为什么Java使用修改后的UTF-8而不是UTF-8? [关闭]


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

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


2602
2018-03-15 19:26


起源

我问你为什么要读取不在java中的序列化java对象:-) - radai
@radai:我不是在读任何东西,只是问一个问题。 =) - vitaut
在那种情况下,我认为NPE是对的。看起来他们在需要与C交互时使用它(序列化,JNI,类文件解析) - radai
这个决定是由Sun的一名员工非常非常很久以前做出的。可能那个人知道答案,没有人知道答案。所有你要到达的地方都是猜测。 - bmargulies
他会把他的秘密带到严肃的地方! - ZhongYu


答案:


处理增补字符(通过不处理它们)更快更简单。

Java代表 人物 为16位 chars,但是unicode已经发展为包含超过64K个字符。因此,一些字符,即补充字符,必须以2编码 char在Java中的s(代理对)。

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

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

由于两端都是Java,我们可以采取一些快捷方式并直接编码 char 水平

char -> bytes -> char

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


9
2018-03-15 20:57



@downvoter不明原因的downvotes可能被视为仅仅是网站故意破坏。如果您认为这个答案没用,请说明原因。 - user207421
从中可以看出,永远不要将“修改过的UTF-8”(例如来自DataOutputStream)用于不打算从Java读回的外部存储。 - robinst


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


1
2018-03-15 19:28





有一个很好的描述修改UTF-8 in Unicode解释 - 页面306,但它没有解释 为什么 修改后的UTF-8已经确定。

Java自己的文档中还有一个非常详细的解释,说明如何最初将非BMP Unicode字符添加到Java: Java平台中的补充字符。但同样,没有解释 为什么 修改后的UTF-8已经确定。

我不认为你会找到一个 为什么 除非你直接询问Java的架构师。


1
2018-03-16 18:56



这是一个很好的描述 怎么样,但我没有看到任何信息 为什么 - Jonas H