Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将非7位ASCII格式的字母转换为ASCII(如ń;到n和ą;到a)_Python_String_Utf 8_Ascii - Fatal编程技术网

Python 将非7位ASCII格式的字母转换为ASCII(如ń;到n和ą;到a)

Python 将非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

我正在寻找一种在Python3中快速且可能方便的方法,将包含非ascii字母的字符串转换为仅包含ascii字母的单词

例子

żółw=>zolw

莫扎克=>mozdzek

łódź=>lodz

等等

国家字母表中有许多字母可以转换为ASCII字母(如n到n)。我可以为我的语言(波兰语)手动完成,方法是指定如何翻译每个字母。但是有没有自动化的方法可以做到这一点?或者某个图书馆能满足我的需要

Pythons
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]标记确实起到了作用。