2016-01-25 56 views
3

我发现Java的char和codepoint的区别是奇怪的和不合适的。澄清Java对Unicode的进化支持

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

但是然后length()似乎返回代码点的数量,而codePointCount()也返回代码点的数量,而是结合复合字符..最终不是真正的代码点的实际计数?

感觉好像charAt()应返回String,使复合材料和代理人沿带和length()结果应与codePointCount()交换。

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

更新:codePointAt()codePointBefore()

另外值得一提的是,codePointAt()codePointBefore()接受指数作为参数,但该指数的行为对字符,并有一系列的0length() - 1,因此不是基于如字符串中的代码点数量一样,可以假设。

更新:equalsIgnoreCase()

String.equalsIgnoreCase()使用术语normalization来形容前比较字符串它做什么。这是一个误称,因为在Unicode字符串的上下文中规范化可能意味着完全不同的东西。他们的意思是说他们使用案例折叠。

+1

自从Java 1.0以来,Unicode在其疣体上发展了疣? – chrylis

+0

你说得对。多一点搜索提供了这个:http://programmers.stackexchange.com/questions/174947/why-does-java-use-utf-16-for-internal-string-representation?answertab=votes#tab-top – Zhro

+0

值得注意的是,你读的API错误'但是,然后length()似乎返回码点数''。从JDK7 API中,它表示“长度等于字符串中Unicode代码单元的数量”。请注意,它是“Unicode代码单元”而不是“代码点” –

回答