首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将非7位ASCII码的字母转换为ASCII码(如ń到n,ą到a)

将非7位ASCII码的字母转换为ASCII码(如ń到n,ą到a)
EN

Stack Overflow用户
提问于 2012-01-20 07:56:31
回答 1查看 2K关注 0票数 8

我正在寻找一种快速和可能方便的方式在Python3翻译字符串与非ascii字母的单词只有ascii字母。

示例!

使用=> zolw的żół

móżdżek => mozdzek

=>łódź罗兹

以此类推。

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

蟒蛇str.encode()不行,因为"żółw".encode('ascii', 'replace') == "???w""żółw".encode('ascii', 'ignore') == "w"..。

我可以为波兰语字母做这样的翻译,但我不想为其他所有语言做这样的翻译:

代码语言:javascript
复制
>>> 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'

上面的代码做了我想要的波兰字母,但它是丑陋的:<什么是最好的方法来做到这一点?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-20 08:05:03

模块可以用于此目的。它具有操作Unicode字符名称的函数:namelookup

现在让我们更仔细地看一下它们。

代码语言:javascript
复制
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'

看到模式了吗?让我们创建一个利用它的函数:

代码语言:javascript
复制
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,删除后面的所有内容,并将其返回给lookup函数。

如果没有' with ',则引发ValueError,当没有具有该名称的字符时,引发KeyError,因此函数返回字符不变。

下面是一个根据前面的函数“翻译”字符串的函数:

代码语言:javascript
复制
def normalize(s):
    return ''.join(normalize_char(c) for c in s)

normalize('Móżdżek') == 'Mozdzek'

因此,这个解决方案显然非常好,但我将在下面保留前面的解决方案。

unicodedata模块也有一个函数,可以保证类似的结果-带有'NFKD'参数的normalize (兼容性分解),但它遗漏了大多数字符。

如果您有字符数据,则可以改进您提供的代码。

代码语言:javascript
复制
letters={'ł':'l', 'ą':'a', 'ń':'n', 'ć':'c', 'ó':'o', 'ę':'e', 'ś':'s', 'ź':'z', 'ż':'z'}
trans=str.maketrans(letters)
result=text.translate(trans)

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

如果您不介意使用外部库,那么您可能想尝试一下。它就是为这个而生的。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8935111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档