澄清Java对Unicode的进化支持

时间:2016-01-25 02:36:20

标签: java string unicode unicode-string

我发现Java对char和codepoint的区分是奇怪的和不合适的。

例如,字符串是一个字符数组或“以字母表示的字母”;与可能是单个字母或可能是复合或代理对的代码点相反。但是,Java将字符串的字符定义为char,它不能复合或包含代码点的代理项和int(这很好)。

但是length()似乎返回了代码点的数量,而codePointCount()也返回了代码点的数量,而是组合了复合字符..这最终不是真正的代码点计数?

感觉好像charAt()应该返回String,以便合成和代理被带来,length()的结果应与codePointCount()交换。

最初的实施感觉有点倒退。它的设计方式是否有原因?

更新:codePointAt()codePointBefore()

同样值得注意的是codePointAt()codePointBefore()接受索引作为参数,但是,索引作用于字符并且范围为0length() - 1并且因此,不是基于字符串中的代码点数量,正如人们可能认为的那样。

更新:equalsIgnoreCase()

String.equalsIgnoreCase()使用术语normalization来描述比较字符串之前的作用。这是一个误称,因为Unicode字符串上下文中的规范化可能意味着完全不同。他们的意思是他们使用案例折叠。

1 个答案:

答案 0 :(得分:2)

创建java时,Unicode没有代理字符的概念,java决定将字符表示为16位值。

我认为他们不想破坏向后兼容性。这里有更多信息:http://www.oracle.com/us/technologies/java/supplementary-142654.html