java - 阐明 Java 对 Unicode 的进化支持

标签 java string unicode unicode-string

<分区>

我发现 Java 对 char 和代码点的区分很奇怪而且不合时宜。

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

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

感觉好像 charAt() 应该返回一个 String,这样就可以带来复合和代理以及 length() 的结果应该与 codePointCount() 交换。

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

更新:codePointAt()codePointBefore()

还值得注意的是,codePointAt()codePointBefore() 接受一个索引作为参数,然而,索引作用于字符并且有一个范围 0length() - 1,因此并不像人们可能假设的那样基于字符串中代码点的数量。

更新:equalsIgnoreCase()

String.equalsIgnoreCase() 使用术语 normalization 来描述它在比较字符串之前所做的事情。这是用词不当,因为在 Unicode 字符串的上下文中规范化可能意味着完全不同的东西。他们的意思是说他们用的是case-folding。

最佳答案

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

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

关于java - 阐明 Java 对 Unicode 的进化支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34984271/

相关文章:

java - 为什么可以将一种类型的数组存储在另一种类型的变量中?

java - UTF-8 和 UTF-16 的区别?

unicode - 如何从 Unicode 网站获取完整的 Unicode 表情符号列表

unicode - Karate - 如何处理 unicode 字符?

java - 使用正则表达式查找文本中的字符串列表

java - Resteasy Client 在方法抛出异常后保持连接分配

python - 如何保持 (+/-) 数字的分隔符空间大小?

c++ - 'std::string' 没有名为 'front' 的成员

java - Java 中的自定义 JMenuItems

c# - 如何使用c#拆分字符串