我发现Java的char和codepoint的区别是奇怪的和不合适的。澄清Java对Unicode的进化支持
例如,一个字符串是一个字符或“字母出现在字母表中”的数组;与可能是单个字母或可能是复合或代理对的代码点相反。但是,Java将字符串的字符定义为char
,该字符不能是复合的或包含代码点的替代项,并且可以作为int
(这很好)。
但是然后length()
似乎返回代码点的数量,而codePointCount()
也返回代码点的数量,而是结合复合字符..最终不是真正的代码点的实际计数?
感觉好像charAt()
应返回String
,使复合材料和代理人沿带和length()
结果应与codePointCount()
交换。
最初的实现感觉有点倒退。它的设计方式是否有其原因?
更新:codePointAt()
,codePointBefore()
另外值得一提的是,codePointAt()
和codePointBefore()
接受指数作为参数,但该指数的行为对字符,并有一系列的0
到length() - 1
,因此不是基于如字符串中的代码点数量一样,可以假设。
更新:equalsIgnoreCase()
String.equalsIgnoreCase()使用术语normalization
来形容前比较字符串它做什么。这是一个误称,因为在Unicode字符串的上下文中规范化可能意味着完全不同的东西。他们的意思是说他们使用案例折叠。
自从Java 1.0以来,Unicode在其疣体上发展了疣? – chrylis
你说得对。多一点搜索提供了这个:http://programmers.stackexchange.com/questions/174947/why-does-java-use-utf-16-for-internal-string-representation?answertab=votes#tab-top – Zhro
值得注意的是,你读的API错误'但是,然后length()似乎返回码点数''。从JDK7 API中,它表示“长度等于字符串中Unicode代码单元的数量”。请注意,它是“Unicode代码单元”而不是“代码点” –