2012-01-19 93 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