如何将Unicode字符转换为近似ASCII字符?支持连字与非拉丁字符处理
Unicode转ASCII字符的进阶解决方案
我发现Python的unicodedata包可以移除拉丁字母的变音符号,比如把é转成e、ü转成u,示例代码如下:
>>> import unicodedata >>> unicodedata.normalize('NFKD', u'éü').encode('ascii', 'ignore') b'eu'
但这个工具存在两个明显局限:
- 无法拆分连字,比如
æ不能转为ae、œ不能转为oe - 无法将无点i(
ı)转换为普通的i
用包含这些字符的字符串测试,结果如下:
>>> unicodedata.normalize('NFKD', u'éüœıx').encode('ascii', 'ignore') b'eux'
现在需要找到能满足以下需求的工具或方法:
- 处理上述
unicodedata解决不了的拉丁字符场景(连字拆分、无点i转换) - 将非拉丁字符(如西里尔字母
И转i、阿拉伯字母أ转a)转为相似ASCII字符,无需精准音译,只要避免空输出(比如全西里尔文本Все люди рождаются свободными用unicodedata处理后为空,需要得到有效内容)
推荐使用unidecode库
unidecode是专门做Unicode到ASCII近似转换的Python库,完全能覆盖上述需求:
- 先安装库:
pip install unidecode
- 示例代码及效果:
>>> from unidecode import unidecode >>> # 处理拉丁字符的连字和无点i >>> unidecode(u'éüœıx') 'eueix' >>> # 处理西里尔字母 >>> unidecode(u'Все люди рождаются свободными') 'Vse lyudi rozhdayutsya svobodnymi' >>> # 处理阿拉伯字母 >>> unidecode(u'أ') 'a' >>> # 混合多种字符的情况 >>> unidecode(u'éüœıx И أ') 'eueix i a'
这个库通过预定义的映射表,把几乎所有Unicode字符转换成最接近的ASCII等价物,不管是拉丁扩展字符还是非拉丁文字,都能生成有意义的ASCII输出,完美解决unicodedata的局限性。
内容的提问来源于stack exchange,提问作者fauve
相关产品推荐
相关产品推荐

