如何使用复合字符正确规范化字符串?

2022-09-02 10:59:42

Java Normalize已经允许我采用重音字符并输出非重音字符。但是,它似乎根本没有很好地处理复合字符(Œ,Æ)。

Java有没有办法在本地处理这些字符?我想避免必须保留这些字符的Map(因为这是我们首先使用Normalize的原因)。

例如,输入“Œ”应返回“OE”,这与它已经将“1/2”等字符整齐地分解为“1/2”的方式大致相同。


答案 1

TLDR;不,使用本机java无法统一处理这些。

长答案

如本问题中所述,分隔 Unicode 连字字符时,Java 规范化程序实现不支持书面语言中存在的所有连字。

这样做的原因是 Unicode 不支持书面语言中存在的所有连字。当涉及到书面语言的存储时,连字是一个有争议的主题,因为可以提出一个论点,即从数据角度来看它们不重要,从布局的角度来看它们很重要。

Data 观点声称不会丢失任何信息,因此仅使用分解的表单更有意义,并且组合表单不应使用 Unicode 格式。

Layout 观点声称,组合连字表示书面语言形式的正确布局,因此应该在数据中用特殊代码表示。

可能的解决方案

我建议创建一个服务,该服务具有仅处理连字的接口。提供一个具体的实现来处理您当前需要的所有内容。将来,如果需要新的实现,只需将新的JAR添加到添加缺失连字的程序类路径中,就可以简单地添加它们而无需修改原始代码。

骨架实现可能如下所示。

请注意,我省略了实际使用 和 实现的代码。ServiceLoaderLigatureDecoderLigatureEncoder

final class Ligatures {
  public static CharSequence compose ( CharSequence decomposedCharacters );
  public static CharSequence decompose ( CharSequence composedCharacters );
}

interface LigatureDecoder {
  CharSequence decompose ( CharSequence composedCharacters );
}

interface LigatureEncoder {
  CharSequence compose ( CharSequence decomposedCharacters );
}

答案 2

推荐