如何在 python 中将修饰的拉丁 unicode 字符转换为普通拉丁语

How do I convert decorated latin unicode characters to plain latin in python

提问人:xaviersjs 提问时间:8/23/2019 更新时间:9/6/2019 访问量:356

问:

Unicode 指定了可以对拉丁字符进行的一系列修改。如何在python中将这些unicode字符转换为普通拉丁字符?

需要明确的是,我不是在问如何摆脱字母中的重音。我问的是如何转换在语言上具有相同含义的东西,但一些装饰的显示器,如负片、包围、封闭在盒子里的显示器类型。

例如,我如何转换

💦 °原来°💦 C

💦 °原来°💦 C

(剥离这些非语言字符将是一项单独的任务)

Python Unicode

评论


答:

1赞 Kevin Welch 8/23/2019 #1

最简单的方法是自己制作转换图。
像这样:

conversion_map = {'🄾': 'o', '🅁': 'r', '🄸': 'i'}

我不知道转换这些值的简单逻辑方法......但有人随时纠正我。

您也可以在此处寻找其他想法。Latin-1 为 ASCII

评论

1赞 wjandrea 8/23/2019
Alyssa 的答案可能是最好的解决方案,但 FWIW,使用 和 更容易,例如str.maketransstr.translatetrans = str.maketrans('🄰🄱🄲', 'ABC'); '🄰🄱🄱🄰'.translate(trans) -> 'ABBA'
11赞 Alyssa Haroldsen 8/23/2019 #2

这并不完美,但你要找的是像Unicode分解这样的东西。Unicode规范化和分解的概念本身就是一本书。

对于快速而肮脏的东西,幸运的是,Python 为你内置了这个!

>>> import unicodedata
>>> unicodedata.normalize('NFKC', '💦°🄾🅁🄸🄶🄸🄽🄰🄻°💦 c')
'💦°ORIGINAL°💦 c'
1赞 xaviersjs 9/6/2019 #3

尽管我接受了 Alyssa Haroldsen 的回答,但我也想提供一个替代方案来解决我真正想要的问题。如果我只保留字母字符,我不仅会去掉修饰符,还会去掉各种非字母字符(如表情符号和数学符号)。

我担心我最终会去掉汉字或其他非拉丁字符,但显然所有语言的字符都被认为是 unicode 标准的字母

# only keep letters, which apparently includes all kinds of languages https://www.compart.com/en/unicode/category/Lo
keep_categories = ('Ll', 'Lm', 'Lo', 'Lt', 'Lu', 'Zs')
filtered_string  = ' '.join(''.join(filter(lambda c: unicodedata.category(c) in keep_categories, w)) for w in words)

评论

0赞 Alyssa Haroldsen 5/20/2020
作为提示,更改为一组可能会加快速度。keep_categories
0赞 xaviersjs 5/21/2020
嗯,你真的让我想知道。我见过小集合的搜索算法在线性时间算法中比对数算法表现得更好。但在这种情况下,匹配集很小,但与之匹配的项目数量很大。我想这使得它与 M >> N 一起成为 O(M log(N))。我无法从分析上弄清楚这一点,但我真的很想看看实际的分析结果会返回什么。你有什么想法?谢谢你提到它!对于处理未知长度字符串的函数来说,性能绝对很重要!
0赞 xaviersjs 5/23/2020
我认为从Big-O的意义上说,你绝对是对的。M*log(6) 远小于 M*6 :D谢谢你的建议!