【问题标题】:Clarifying Java's evolutionary support of Unicode [closed]阐明 Java 对 Unicode 的进化支持 [关闭]
【发布时间】:2016-05-01 06:29:50
【问题描述】:

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

例如,字符串是字符数组或“出现在字母表中的字母”;与可能是单个字母或可能是复合或代理对的代码点相反。但是,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 的疣上长了疣?
  • 你是对的。提供更多搜索:programmers.stackexchange.com/questions/174947/…
  • 值得注意的是,您读错了But then length() seems to return the number of codepoints 的 API。来自 JDK7 API,它说“长度等于字符串中 Unicode 代码单元的数量”。请注意,它是“Unicode 代码单元”而不是“代码点”

标签: java string unicode unicode-string


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多