【发布时间】:2015-11-04 10:34:16
【问题描述】:
我正在处理 Java 中的文件名列表。
我观察到文件名中的一些单个字符,例如 a、ö 和 ü 实际上由一个序列组成,您可以将其描述为两个单个 ASCII 字符:
ö由o、¨表示
我通过codePointAt() 的检查看到了这一点。德国名字“Rölli”实际上是“Ro¨lli”:
...
20: R, 82
21: o, 111
22: ̈, 776
23: l, 108
24: l, 108
25: i, 105
...
上面日志中的字符¨有value 776,这是一个“组合分音”。这是一个所谓的组合标记,属于graphemes,或者更准确地说属于combining diacritics。所以这一切都说得通,但我不明白是什么软件组件将这两个字符组合成一个变音符号,以及在哪里指定了这种行为。
- 这与强大的字符代码表使用多个字节作为内部表示这一事实无关。几个字节与两个组合字符不同。
- 字符串的任何简单
print()都会显示组合字符,因此它既不是上面的某个UI 层。 - 我记得在 PHP 中也观察到了这一点。我想任何现代语言都可以处理这个问题。
什么组件导致组合字符显示为单个组合字符?这一切有多可靠?
Java 是否有一种规范化方法,可以将单个代码点变成组合代码点,例如 here?对使用正则表达式会有帮助...
非常感谢任何提示。
【问题讨论】:
标签: java string character-encoding unicode-normalization combining-marks