Wec*_* E. 18 java unicode-normalization
Java Normalize已允许我使用重音字符并输出非重音字符.但是,它似乎并没有完全处理复合字符(Œ,Æ).
有没有办法让Java本地处理这些字符?我想防止必须保留这些字符的映射(因为这是我们首先使用Normalize的原因).
例如,"Œ"的输入应该返回"OE",就像它已经将诸如"½"之类的字符整齐地分解为"1/2"的方式一样.
太长了; 不,原生java没有办法统一处理这些。
长答案
正如这个问题分离Unicode连字字符中所述,Java规范化器实现不支持书面语言中存在的所有连字。
原因是 Unicode 不支持书面语言中存在的所有连字。当涉及到书面语言的存储时,连字是一个有争议的话题,因为可以说从数据角度来看它们不重要,但从布局角度来看它们很重要。
数据观点声称不会丢失任何信息,因此仅使用分解形式更有意义,并且组合形式不应采用 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 );
}
Run Code Online (Sandbox Code Playgroud)