2010-11-12 14 views
16

Merhaba Ben İngilizce gibi "ıöüç" onları normalleştirmek isterken böyle u"ıöüç" gibi özel karakterleri içeren bir yabancı kaynaktan metin tabanlı utf8 verilerini almak ->"iouc". Bunu başarmanın en iyi yolu ne olurdu? Ben Unidecode module kullanılması önerilirPython ve karakter normalleştirme

+0

Arama ve belki değiştirmezseniz, gerçi normal bir karaktere özel tam dizisine sahip olmak gerekir. – soulseekah

cevap

36

: Eğer bunu bir unicode dize beslemek ve bir bayt dize verir nasıl

>>> from unidecode import unidecode 
>>> unidecode(u'ıöüç') 
'iouc' 

Not. Çıkış ASCII olarak garanti edilir.

+3

Güzel bir +1 http://pypi.python.org/pypi/Unidecode/0.04.1 – soulseekah

0
import unicodedata 
unicodedata.normalize() 

http://docs.python.org/library/unicodedata.html

+0

Şaşkınım: print unicodedata.normalize ('NFKD', u "ıöüç") denedim ve çıktı tekrar: ıöüç – Hellnar

+0

Diğer geçerli değerler 'NFC', 'NFKC', 'NFD' ve 'NFKD'. – soulseekah

+2

Oldukça eminim ki bu, liderin aradığıdan farklı bir işlemdir. Ama evet, bu unicode normalizasyonu. Onun sorduğu şey genellikle böyle denmez. – drxzcl

5

Her şey sonucu çevirmek için ne kadar ilerlemek istediğinize bağlı olarak değişir. Her şeyi ASCII'ye (αβγ - abg) dönüştürmek istiyorsanız, o zaman unidecode gitmek için bir yoldur.

sadece aksanlı harfleri Aksan kaldırmak istiyorsanız, o zaman ait olan (normalleştirme formu NFKD (bu U+0301 COMBINING ACUTE ACCENT ardından düz bir mektupta a için vurgulu harf á dönüştürür) kullanarak dize çürüyen ve sonra aksan atarak deneyebilirsiniz Unicode character classMn - "İşaretleme, nonspacing").

import unicodedata 

def remove_nonspacing_marks(s): 
    "Decompose the unicode string s and remove non-spacing marks." 
    return ''.join(c for c in unicodedata.normalize('NFKD', s) 
        if unicodedata.category(c) != 'Mn') 
1

basit yolu buldum:

unicodedata.normalize('NFKD', s).encode("ascii", "ignore")