分隔 Unicode 连字字符

2022-09-02 01:24:22

在大量的 Unicode 字符中,有一些字符实际上表示多个字符,例如两个“f”字符的 U+FB00 连字 ff。有没有办法轻松地将这样的字符转换为多个单个字符?最好是标准Java API中提供的东西,但如果需要,我可以参考外部库。


答案 1

U+FB00 是一个兼容性字符。通常,Unicode 不支持连字的单独代码点(认为是否以及何时应该使用连字是布局决策,不应该影响数据的存储方式)。其中一些仍然存在,以允许与较旧的编码进行往返转换兼容性,这些编码确实将连字表示为单独的实体。

幸运的是,连字表示哪些字符的信息存在于 Unicode 数据文件中,并且大多数功能强大的字符串处理系统都内置了该数据。

在 Java 中,您需要使用 NormalizerNFKC 窗体:

String ff ="\uFB00";
String normalized = Normalizer.normalize(ff, Form.NFKC);
System.out.println(ff + " = " + normalized);

这将打印

ff = ff

答案 2

您正在谈论的过程称为规范化,并在 Unicode 规范化表单技术说明中指定。

Java SE 类库中有一个名为 java.text.Normalizer 的类,它实现了此过程。但是,您需要阅读上面链接的Unicode文档,以确定需要使用哪种“规范化形式”来获得所需的结果。这并不简单....