Python 将非7位ASCII格式的字母转换为ASCII(如ń;到n和ą;到a)
我正在寻找一种在Python3中快速且可能方便的方法,将包含非ascii字母的字符串转换为仅包含ascii字母的单词 例子 żółw=>zolw 莫扎克=>mozdzek łódź=>lodz 等等 国家字母表中有许多字母可以转换为ASCII字母(如n到n)。我可以为我的语言(波兰语)手动完成,方法是指定如何翻译每个字母。但是有没有自动化的方法可以做到这一点?或者某个图书馆能满足我的需要 PythonsPython 将非7位ASCII格式的字母转换为ASCII(如ń;到n和ą;到a),python,string,utf-8,ascii,Python,String,Utf 8,Ascii,我正在寻找一种在Python3中快速且可能方便的方法,将包含非ascii字母的字符串转换为仅包含ascii字母的单词 例子 żółw=>zolw 莫扎克=>mozdzek łódź=>lodz 等等 国家字母表中有许多字母可以转换为ASCII字母(如n到n)。我可以为我的语言(波兰语)手动完成,方法是指定如何翻译每个字母。但是有没有自动化的方法可以做到这一点?或者某个图书馆能满足我的需要 Pythonsstr.encode()不行,因为“żó322; w”.encode('ascii','rep
str.encode()
不行,因为“żó322; w”.encode('ascii','replace')==“??w”
和“żó322; w”。encode('ascii',ignore')==“w”
我可以翻译波兰语字母,但我不想翻译其他语言:
>>> utf8_letters = ['ą','ę','ć','ź','ż','ó','ł','ń','ś']
>>> ascii_letters = ['a','e','c','z','z','o','l','n','s']
>>> trans_dict = dict(zip(utf8_letters,ascii_letters))
>>> turtle = "żółw"
>>> out = []
>>> for l in turtle:
... out.append(trans_dict[l] if l in trans_dict else l)
>>> result = ''.join(out)
>>> result
'zolw'
上面的代码符合我对波兰语字母的要求,但很难看:<实现这一点的最佳方法是什么
当然,这样的翻译会改变一些单词的含义,但这没关系。模块可以用于此。
它具有操作Unicode字符名的函数:和
现在让我们仔细看看
name('Ż') == 'LATIN CAPITAL LETTER Z WITH DOT ABOVE'
name('ł') == 'LATIN SMALL LETTER L WITH STROKE'
lookup('LATIN CAPITAL LETTER Z') == 'Z'
lookup('LATIN SMALL LETTER L') == 'l'
看到模式了吗?让我们制作一个利用它的函数:
import unicodedata
def normalize_char(c):
try:
cname = unicodedata.name(c)
cname = cname[:cname.index(' WITH')]
return unicodedata.lookup(cname)
except (ValueError, KeyError):
return c
normalize_char('ę') == 'e'
normalize_char('Ę') == 'E'
normalize_char('ś') == 's'
它在字符名中查找单词WITH,删除后面的所有内容并将其反馈给函数。如果没有“WITH”,则会引发
ValueError
,如果没有具有此名称的字符,则会引发KeyError
,因此函数会返回未更改的字符
下面是一个函数,它根据前面的函数“转换”字符串:
def normalize(s):
return ''.join(normalize_char(c) for c in s)
normalize('Móżdżek') == 'Mozdzek'
所以这个解决方案显然非常好,但我将在下面留下前面的解决方案
该模块还具有一个函数,该函数承诺类似的结果–使用
'NFKD'
参数(兼容性分解),但它忽略了大多数字符
如果您有字符数据,则可以改进您提供的代码
letters={'ł':'l', 'ą':'a', 'ń':'n', 'ć':'c', 'ó':'o', 'ę':'e', 'ś':'s', 'ź':'z', 'ż':'z'}
trans=str.maketrans(letters)
result=text.translate(trans)
是一个包含字符数据的好表。这是JavaScript,但可以轻松地用于Python
如果您不介意使用外部库,您可能想试试。它就是为了这个而制作的。不幸的是,unicodedata.normalize('NFKD','żółw')=='żółw'而不是'zolw':(分解为NFD,然后扔掉所有的组合标记怎么样?你喜欢的这个表很好,这个Unidecode库很有前途!到目前为止,我认为没有更好的方法可以做到这一点。@DougMcClean:对不分解的字符不起作用(例如,“”)啊,是的,如果你想做这样的事情,我认为你需要建立一个表格。或者做一些疯狂的事情,比如渲染,然后是OcLink。记住,在一些语言中,有些人会认为重音字母被认为是一种不同的字母。om‘a’,而不仅仅是上面有一个环的字母‘a’。我知道……问题是,当我在某个地方用波兰语写作时,如果我的国家字母不受支持,我会使用这种“翻译”我写过。我想其他国家的人在这样的环境中有自己的写作方式。我想知道如何进行这样的转换。@John Saunders,谢谢你使我的答案完全无效。我是如何使你的答案无效的?@JohnSaunders:[python-3.x]标记确实起到了作用。