将非7bit ASCII的字母转换为ASCII(如从n到n,从ą到a)

2024-10-01 11:35:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python3中寻找一种快速且可能方便的方法,将非ascii字母的字符串转换为只有ascii字母的单词。在

例子!在

żółw=>;zolw

莫扎克=莫扎克

łódź=>;洛兹

等等。。。在

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

Pythonstr.encode()不行,因为"żółw".encode('ascii', 'replace') == "???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'

上面的代码可以满足我对波兰字母的要求,但是它很难看:<;最好的方法是什么?在

当然,这样的翻译会改变一些词的意思,但这没关系。在


Tags: 方法ingt语言trans字母asciiresult
1条回答
网友
1楼 · 发布于 2024-10-01 11:35:41

unicodedata模块可用于此操作。 它有操作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'

看到图案了吗?让我们做一个利用它的函数:

^{pr2}$

它查找字符名中包含的单词,删除其后面的所有内容并将其反馈给^{}函数。
如果不存在带
的',则引发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)

Here是一个很好的包含字符数据的表。这是JavaScript,但可以很容易地用于Python。在


如果您不介意使用外部库,您可以尝试Unidecode。它就是为这个做的。在

相关问题 更多 >