如何正确规范化具有复合字符的字符串?

How to properly Normalize a String with composite characters?

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

Java有没有办法原生处理这些字符?我想避免必须保留这些字符的映射(因为这是我们首先转向使用 Normalize 的原因)。

例如,“Œ”的输入应该 return "OE",与它已经将“½”等字符巧妙地分解为“1/2”的方式大致相同。

TLDR; 不,原生 java 无法统一处理这些问题。

长答案

如本问题所述,Separating Unicode ligature characters, the Java Normalizer 实施不支持书面语言中存在的所有连字。

这是因为 Unicode 不支持书面语言中存在的所有连字。当涉及到书面语言的存储时,连字是一个有争议的话题,因为可以说它们从数据的角度来看并不重要,而从布局的角度来看它们很重要。

数据观点声称没有信息丢失,因此只使用分解形式更有意义,组合形式不应采用 Unicode。

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

可能的解决方案

我建议创建一个 Service,它有一个仅处理连字的界面。提供一个具体的实现来处理您当前需要的所有内容。将来如果需要新的实现,只需将新的 JAR 添加到程序 class-添加缺失连字的路径,即可轻松添加它们而无需修改原始代码。

框架实现可能如下所示。

请注意,我省略了实际使用 ServiceLoader 来定位 LigatureDecoderLigatureEncoder 实现的代码。

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 );
}