2012-01-19 181 views
8

我正在寻找一种快速且可能方便的方式在Python 3中将非ASCII字母的字符串转换为仅带有ascii字母的字词。将字母不是7位ASCII转换为ASCII(如将n转换为n并将其转换为±)

例子!

żółw=> zolw

móżdżek=> mozdzek

罗兹=>罗兹

等等...

有国家字母许多字母可以变成ASCII字母(如ñ到n)。我可以通过指定如何翻译每个字母来手动执行我的语言(波兰语)。但是有没有自动化的方法来做到这一点?或者一些图书馆会做我所需要的?

蟒蛇str.encode()不会做,因为"żółw".encode('ascii', 'replace') == "???w""żół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' 

上面的代码做了我想要的波兰语字母,但它很丑:<这样做的最好方法是什么?

当然,这样的翻译会改变一些单词的含义,但那是可以的。

+1

请记住,在某些语言中,某些人认为重音字母被认为是该语言中的一个不同的字母。例如,瑞典语中的字母'å'通常被认为是'a'中的一个不同的字母,而不是简单的字母'a',在上面有一个圆环。 – dreamlax

+0

我意识到这一点...关键是,当我在某处写作波兰语的地方,我的国家信件不被支持时,我使用我写的这个“翻译”。我猜其他国家的人在这种环境下有自己的写作方式。我想知道如何完成这样的转换。 – Maciek

+0

@John Saunders,谢谢你让我的答案完全失效。 –

回答

5

unicodedata模块可用于此目的。 它具有操作Unicode字符名称的功能:namelookup

现在让我们仔细看看它们。

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' 

它看起来与在角色名字字,删除它之后进入并反馈给lookup功能应有尽有。
如果没有'WITH',则会产生ValueError,如果没有这样的名称的字符,则会引发KeyError,所以函数返回字符不变。

这里是一个函数,它“翻译”基于先前的功能的字符串:

def normalize(s): 
    return ''.join(normalize_char(c) for c in s) 

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

所以这种解决方案显然是非常不错的,但我会离开低于以前的。


unicodedata模块还具有承诺类似的结果– normalize'NFKD'参数(兼容性分解)的函数,但它最错过字符。


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

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

Here是一个不错的表具有字符数据。这是JavaScript,但可以轻松用于Python。


如果你不介意使用外部库,你可能想试试Unidecode。它只是为了这个。

+0

Unfortunatley unicodedata.normalize('NFKD',“żółw”)=='żółw'not'zolw':( – Maciek

+0

如何分解为NFD,然后扔掉所有的组合标记? –

+0

这张表,你喜欢是伟大的,这Unidecode库非常有希望!至于现在我认为没有更好的方法来做到这一点 – Maciek