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

问题描述:

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

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

+0

我couild问你为什么你想要读取不在java中的序列化java对象:-) – radai 2013-03-15 19:39:30

+1

@radai:我不读任何东西,只是问一个问题。 =) – vitaut 2013-03-15 19:41:42

+1

在这种情况下,我认为NPE是正确的。看起来像他们在需要与C进行交互时使用它(序列化,JNI,类文件解析) – radai 2013-03-15 19:50:25

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

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

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

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

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

char -> bytes -> char 

既不编码解码器,也不需要进行编码担心代理对。

+0

@downvoter无法解释的downvotes很容易被视为纯粹的网站破坏行为。如果你认为这个答案没有用,请说明原因。 – EJP 2013-03-15 23:51:22

+0

从这个角度来看,从未使用“修改过的UTF-8”(例如来自DataOutputStream)用于不打算从Java中读回的外部存储。 – robinst 2015-05-20 06:43:18

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

Unicode Explained - Page 306中的修改UTF-8有很好的描述,但它没有说明为什么修改了UTF-8。

在Java自己的文档中,还非常详细地解释了如何支持非BMP Unicode字符最初添加到Java:Supplementary Characters in the Java Platform。但是,再次,没有解释为什么修改的UTF-8决定。

我不认为你会发现一个为什么,除非你直接问Java的建筑师。

+0

这是_how_的一个很好的描述,但我在_why_上看不到任何信息 – 2013-03-16 19:04:27