首页 > 解决方案 > 如何将(某些)Unicode 简化为 ASCII?

问题描述

给定一个名称的 unicode 字符串,例如

"Guns N’ Roses, 2 × 4, Rust in Peace… Polaris, Black No. 1 (Little Miss Scare‐All), À Tout Le Monde"

其中每个名称都包含一些非 ASCII 字符('''、'×'、'...'、'‐'、'À'),我正在寻找一种将其简化为的算法

"Guns N' Roses, 2 x 4, Rust in Peace... Polaris, Black No. 1 (Little Miss Scare-All), A Tout Le Monde"

其中每个非 ASCII 字符都已替换为 ASCII 替代字符。

我知道我可以通过以下方式处理一整类字符(包括'À')

Normalizer.normalize(value, Form.NFD).replaceAll("[^\\p{ASCII}]", "");

当然,我可以通过使用一些手工制作的.replaceAll(). 但我想知道是否有一些标准算法不需要枚举我想要替换的所有剩余字符。我想做的事有名字吗?

标签: javaunicodecharacter-encoding

解决方案


如果你想要一个通用的解决方案,这里的StringUtils.stripAccents规则。但是,重音字母不会变成二合字母(如oeae)。还有一些 ASCII 中不存在但没有重音字符的字符,例如德语 ß 必须在事后一一处理,最好是通过链式本地replace()replaceAll() String.class方法。

可能重复是否有办法摆脱重音符号并将整个字符串转换为常规字母?

例子:

żółtość wszędzie, łatwo wątpić w zieloność ówczesnego świata (Polish); école publique et laïque a fait de la orthographe strictement normalisée, sinon sa principale règle (French); eine große Online-Umfrage in  mittleren Großstädten zeigt, wo Fußgänger und ÖPNV-Nutzer zufrieden sind (German)

结果是

zołtosc wszedzie, łatwo watpic w zielonosc owczesnego swiata (Polish); ecole publique et laique a fait de la orthographe strictement normalisee, sinon sa principale regle (French); eine große Online-Umfrage in  mittleren Großstadten zeigt, wo Fußganger und OPNV-Nutzer zufrieden sind (German)

推荐阅读