我们从第三方系统接收符合 UTF-8 标准的数据。我们的系统可以处理它,因为它也兼容 UTF-8。问题是旧的下游系统不能总是处理十进制值 > 127 的字符,并且会损坏或错误地显示数据。
由于我们无法控制下游系统,解决此问题的唯一方法是将“扩展”Ascii 字符转换为其“基本”字符(Ascii < 128) values e.g. ê, ë must become e, or ò, ö must become o, etc.
有没有一种方法可以在 Java 中实现此目的,而无需对映射进行硬编码?
您可以使用 ICU4J
中的
Transliterator
。
假设输入仅包含拉丁字母,
Latin-ASCII
音译器可以删除拉丁字母中的变音符号。
System.out.println(Transliterator.getInstance("Latin-ASCII").transliterate("òóâì"));
// prints ooai
为了安全起见,您可能还想
replaceAll("\\P{IsLatin}", "")
。
如果您对输入有更多了解,例如它是用什么语言编写的,您可以使用专门针对该语言的音译器。例如,如果您知道文本是德语,则可以使用
de-ASCII
代替。这将使用德语特有的转换规则,例如将“ö”替换为“oe”。
有关您可以使用的其他音译器,请参阅 ICU 文档。