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

Java 如何正确地规范化具有复合字符的字符串?,java,unicode-normalization,Java,Unicode Normalization,Java规范化已经允许我获取重音字符并输出非重音字符。然而,它似乎根本不能很好地处理复合字符(Œ,Æ) Java有没有一种本地处理这些字符的方法?我希望不必保留这些字符的映射(因为这就是我们开始使用Normalize的原因) 例如,“Œ”的输入应返回“OE”,这与它已将“½”等字符整齐地分解为“1/2”的方式大致相同 不,本机java无法统一处理这些问题 长答案 如本问题所述,Java实现并不支持书面语言中存在的所有连字 这是因为Unicode不支持书面语言中存在的所有连字。当谈到书面语言的存储

Java规范化已经允许我获取重音字符并输出非重音字符。然而,它似乎根本不能很好地处理复合字符(Œ,Æ)

Java有没有一种本地处理这些字符的方法?我希望不必保留这些字符的映射(因为这就是我们开始使用Normalize的原因)

例如,“Œ”的输入应返回“OE”,这与它已将“½”等字符整齐地分解为“1/2”的方式大致相同 不,本机java无法统一处理这些问题

长答案

如本问题所述,Java实现并不支持书面语言中存在的所有连字

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

Data viewpoint声称不会丢失任何信息,因此只使用分解的表单更有意义,并且合成的表单不应使用Unicode

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

可能的解决方案

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

框架实现可能如下所示

请注意,我省略了实际使用
ServiceLoader
定位
LigatureDecoder
LigatureEncoder
实现的代码

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

但是,请详细说明,它在处理复合字符(Œ,Æ)方面似乎不太好all@SotiriosDelimanolis我想他想要
Normalizer.normalize(“Œ”,Normalizer.Form.NFD).equals(“OE”)为真。我也是。@SotiriosDelimanolis我希望这能澄清它:)@DodgyCodeException-hum,这似乎还不够(结果我也得到了空字符串)@WeckarE。我知道,从某种意义上说,它告诉你这是无法解决的;-)