Sol çift tırnak, kesme işareti için sağ tek tırnak vb. Gibi Unicode noktalama kullanan bazı metinlerim var ve buna ASCII'de ihtiyacım var. Python'da bu karakterlerin bariz ASCII ikamelerine sahip bir veritabanı var mı, böylece hepsini "?" ?
Sol çift tırnak, kesme işareti için sağ tek tırnak vb. Gibi Unicode noktalama kullanan bazı metinlerim var ve buna ASCII'de ihtiyacım var. Python'da bu karakterlerin bariz ASCII ikamelerine sahip bir veritabanı var mı, böylece hepsini "?" ?
Yanıtlar:
Unidecode tam bir çözüm gibi görünüyor. Süslü tırnakları ascii tırnaklarına, vurgulu latin karakterleri vurgusuz karakterlere dönüştürür ve hatta ASCII eşdeğerleri olmayan karakterlerle başa çıkmak için harf çevirisi yapmaya çalışır. Bu şekilde kullanıcılarınızın bir grup görmesi gerekmez mi? metinlerini eski bir 7 bit ascii sisteminden geçirmeniz gerektiğinde.
>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing
http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/
s/ö/oe/
için, geri kalanıyla temizlemeden önce uygulanabilir karakterleri manuel olarak ( vb.) Dönüştürün unidecode
.
ä -> a
, ö -> o
düpedüz yanlıştır, bu hala tercih edilir ae
veoe
Orijinal cevabımda da önerdim unicodedata.normalize
. Ancak, test etmeye karar verdim ve Unicode tırnak işaretleriyle çalışmadığı ortaya çıktı. Aksanlı Unicode karakterlerini çevirmek için iyi bir iş çıkarıyor, bu yüzden unicodedata.normalize
bu unicode.decomposition
işlevi kullanarak uygulandığını tahmin ediyorum , bu da beni muhtemelen yalnızca bir harf ve bir aksan işaretinin birleşimi olan Unicode karakterlerini işleyebileceğine inandırdı, ancak ben gerçekten değilim Unicode spesifikasyonu konusunda bir uzman, bu yüzden sadece sıcak hava dolu olabilirim ...
Her durumda, unicode.translate
bunun yerine noktalama karakterleriyle uğraşmak için kullanabilirsiniz . translate
Yöntem böylece ASCII uyumlu noktalama için yalnızca Unicode noktalama çeviren bir eşlemesi oluşturabilirsiniz Unicode ordinals Unicode ordinals sözlüğü alır:
'Maps left and right single and double quotation marks'
'into ASCII single and double quotation marks'
>>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 }
>>> teststring = u'\u201Chello, world!\u201D'
>>> teststring.translate(punctuation).encode('ascii', 'ignore')
'"hello, world!"'
Gerekirse daha fazla noktalama eşlemesi ekleyebilirsiniz, ancak her Unicode noktalama karakterini kullanma konusunda endişelenmenize gerek olmadığını düşünüyorum. Eğer varsa do sapı aksan ve diğer aksanlı işaretleri gerek, hala kullanabilirsiniz unicodedata.normalize
bu karakterlerle uğraşmak.
İlginç soru.
Google , unicodedata modülünü kullanarak açıklanan bu sayfayı aşağıdaki gibi bulmama yardımcı oldu :
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')