我们有一个系统,客户,主要是欧洲输入文本(UTF-8),必须分发到不同的系统,大多数接受UTF-8,但现在我们还必须将文本分发给只接受美国的美国系统. -Ascii 7位
所以现在我们需要将所有欧洲字符翻译成最近的US-Ascii.是否有任何Java库可以帮助完成此任务?
现在我们刚刚开始添加到翻译表,其中Å(瑞典AA) - > A等等,如果我们找不到输入字符的任何匹配项,我们将记录并替换为问号并试着为下一个版本修复它,但它似乎非常低效,而其他人必须先做过类似的事情.
您可以使用以下内容执行此操作(来自此Core Java技术技巧提示中的NFD示例):
public static String decompose(String s) { return java.text.Normalizer.normalize(s, java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+",""); }
该uni2ascii程序是用C写的,但你可以把它毫不费力可能转换成Java.它包含一个近似的大表(隐含地,在switch-case语句中).
请注意,没有普遍接受的近似值:德国人希望你用AE取代Ä,芬兰人和瑞典人更喜欢A.你的例子Å也不明显:瑞典人可能会掉落戒指并使用A,但丹麦人和挪威人可能更喜欢历史上更正确的AA.
您可以将文本转换为规范化形式D,而不是创建自己的表格,其中字符表示为基本字符加变音符号(例如,"á"将替换为"a",后跟组合锐化重音).然后,您可以删除不是ASCII字母的所有内容.
这些表仍然存在,但现在是Unicode标准中的表.
您也可以尝试NFKD而不是NFD,以捕获更多案例.
参考文献:
http://unicode.org/reports/tr15/
http://www.siao2.com/2005/02/19/376617.aspx
http://www.siao2.com/2007/05/14/2629747.aspx
针对Joe Liversedge给出的答案,引用的Lucene ISOLatin1AccentFilter 不再存在:
它已被org.apache.lucene.analysis.ASCIIFoldingFilter取代:
此类将不在前127个ASCII字符("Basic Latin"Unicode块)中的字母,数字和符号Unicode字符转换为ASCII等效字符(如果存在).转换以下Unicode块中的字符; 但是,只转换那些具有合理ASCII替代字符的字符.
仅供参考 -