如何正确规范化具有复合字符的字符串?
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
来定位 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 );
}
Java Normalize 已经允许我使用重音字符并输出非重音字符。但是,它似乎根本无法很好地处理复合字符 (Œ, Æ)。
Java有没有办法原生处理这些字符?我想避免必须保留这些字符的映射(因为这是我们首先转向使用 Normalize 的原因)。
例如,“Œ”的输入应该 return "OE",与它已经将“½”等字符巧妙地分解为“1/2”的方式大致相同。
TLDR; 不,原生 java 无法统一处理这些问题。
长答案
如本问题所述,Separating Unicode ligature characters, the Java Normalizer 实施不支持书面语言中存在的所有连字。
这是因为 Unicode 不支持书面语言中存在的所有连字。当涉及到书面语言的存储时,连字是一个有争议的话题,因为可以说它们从数据的角度来看并不重要,而从布局的角度来看它们很重要。
数据观点声称没有信息丢失,因此只使用分解形式更有意义,组合形式不应采用 Unicode。
布局观点声称组合连字代表了书面语言的正确布局,因此应该用特殊代码在数据中表示。
可能的解决方案
我建议创建一个 Service,它有一个仅处理连字的界面。提供一个具体的实现来处理您当前需要的所有内容。将来如果需要新的实现,只需将新的 JAR 添加到程序 class-添加缺失连字的路径,即可轻松添加它们而无需修改原始代码。
框架实现可能如下所示。
请注意,我省略了实际使用 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 );
}