澄清 Java 对 Unicode 的进化支持
Clarifying Java's evolutionary support of Unicode
我发现 Java 对 char 和代码点的区分很奇怪而且不合适。
例如,字符串是字符数组或"letters which appear in an alphabet";与可能是单个字母或可能是复合或代理对的代码点相反。但是,Java 将字符串的字符定义为 char
,它不能是复合的或包含代码点的代理项,并且是 int
(这很好)。
但是 length()
似乎是 return 代码点的数量,而 codePointCount()
也是 return 代码点的数量,而是组合了复合字符.. 最终不是真正的代码点数?
感觉好像 charAt()
应该 return 一个 String
以便复合和代理项一起出现并且 length()
的结果应该与 [=14= 交换].
原来的实现感觉有点落后。它的设计方式是否有原因?
更新:codePointAt()
、codePointBefore()
还值得注意的是,codePointAt()
和 codePointBefore()
接受索引作为参数,但是,索引作用于字符,范围为 0
到 length() - 1
,因此并不像人们可能假设的那样基于字符串中代码点的数量。
更新:equalsIgnoreCase()
String.equalsIgnoreCase() 使用术语 normalization
来描述它在比较字符串之前所做的事情。这是用词不当,因为在 Unicode 字符串的上下文中规范化可能意味着完全不同的东西。他们的意思是说他们用的是case-folding
创建 java 时,Unicode 没有代理字符的概念,因此 java 决定将字符表示为 16 位值。
我想他们不想破坏向后兼容性。这里有更多信息:http://www.oracle.com/us/technologies/java/supplementary-142654.html
我发现 Java 对 char 和代码点的区分很奇怪而且不合适。
例如,字符串是字符数组或"letters which appear in an alphabet";与可能是单个字母或可能是复合或代理对的代码点相反。但是,Java 将字符串的字符定义为 char
,它不能是复合的或包含代码点的代理项,并且是 int
(这很好)。
但是 length()
似乎是 return 代码点的数量,而 codePointCount()
也是 return 代码点的数量,而是组合了复合字符.. 最终不是真正的代码点数?
感觉好像 charAt()
应该 return 一个 String
以便复合和代理项一起出现并且 length()
的结果应该与 [=14= 交换].
原来的实现感觉有点落后。它的设计方式是否有原因?
更新:codePointAt()
、codePointBefore()
还值得注意的是,codePointAt()
和 codePointBefore()
接受索引作为参数,但是,索引作用于字符,范围为 0
到 length() - 1
,因此并不像人们可能假设的那样基于字符串中代码点的数量。
更新:equalsIgnoreCase()
String.equalsIgnoreCase() 使用术语 normalization
来描述它在比较字符串之前所做的事情。这是用词不当,因为在 Unicode 字符串的上下文中规范化可能意味着完全不同的东西。他们的意思是说他们用的是case-folding
创建 java 时,Unicode 没有代理字符的概念,因此 java 决定将字符表示为 16 位值。
我想他们不想破坏向后兼容性。这里有更多信息:http://www.oracle.com/us/technologies/java/supplementary-142654.html