1

假设有一个 UnicodeString对象,我想一个一个地打印其中String的每个 Unicode 字符。在我使用非常有限的语言进行的简单测试中,只要假设一个代码点始终与一个字形相同,我就可以连续实现这一点。

但我知道事实并非如此,上面的代码逻辑在某些国家或语言中很容易导致意想不到的结果。

所以我的问题是,有没有办法判断一个 Unicode 代码点是 Java 还是 C# 中的一个完整的可打印字形?如果我必须用 C/C++ 编写代码,那也没关系。

我用谷歌搜索了几个小时,但我得到的只是代码单元和代码点。很容易判断代码单元是否是代理对的一部分,但与字素无关。

有人能指出我正确的方向吗?

4

1 回答 1

3

一个字形通常由多个代码点组成,这绝对是正确的。例如,字母 é(带尖音符的 e)可以等效地书写\u00E9或组合重音为\u0065\u0301。Unicode规范化不能总是将这样的事情合并到一个代码点中,尤其是在有多个组合字符的情况下。因此,您需要使用一些 Unicode 分段规则来识别您想要的边界。

您所说的“可打印字形”称为用户感知字符或(扩展字形簇。在 Java 中,迭代这些的方法是BreakIterator.getCharacterInstance(Locale)

BreakIterator boundary = BreakIterator.getCharacterInstance(Locale.WHATEVER);
boundary.setText(yourString);
for (int start = boundary.first(), end = boundary.next();
        end != BreakIterator.DONE;
        start = end, end = boundary.next()) {
    String chunk = yourString.substring(start, end);
}
于 2018-08-24T14:30:22.773 回答