如何使用复合字符正确规范化字符串?
2022-09-02 10:59:42
Java Normalize已经允许我采用重音字符并输出非重音字符。但是,它似乎根本没有很好地处理复合字符(Œ,Æ)。
Java有没有办法在本地处理这些字符?我想避免必须保留这些字符的Map(因为这是我们首先使用Normalize的原因)。
例如,输入“Œ”应返回“OE”,这与它已经将“1/2”等字符整齐地分解为“1/2”的方式大致相同。
Java Normalize已经允许我采用重音字符并输出非重音字符。但是,它似乎根本没有很好地处理复合字符(Œ,Æ)。
Java有没有办法在本地处理这些字符?我想避免必须保留这些字符的Map(因为这是我们首先使用Normalize的原因)。
例如,输入“Œ”应返回“OE”,这与它已经将“1/2”等字符整齐地分解为“1/2”的方式大致相同。
TLDR;不,使用本机java无法统一处理这些。
长答案
如本问题中所述,分隔 Unicode 连字字符时,Java 规范化程序实现不支持书面语言中存在的所有连字。
这样做的原因是 Unicode 不支持书面语言中存在的所有连字。当涉及到书面语言的存储时,连字是一个有争议的主题,因为可以提出一个论点,即从数据角度来看它们不重要,从布局的角度来看它们很重要。
Data 观点声称不会丢失任何信息,因此仅使用分解的表单更有意义,并且组合表单不应使用 Unicode 格式。
Layout 观点声称,组合连字表示书面语言形式的正确布局,因此应该在数据中用特殊代码表示。
可能的解决方案
我建议创建一个服务,该服务具有仅处理连字的接口。提供一个具体的实现来处理您当前需要的所有内容。将来,如果需要新的实现,只需将新的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 );
}