Python'un "bu Unicode için en iyi ASCII" veritabanı nerede? [kapalı]


86

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:


90

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/


3
Hm .. almanca
umlautlar

4
@ThiefMaster bu eşdeğerler tüm diller için geçerli mi? Belki Unidecode en düşük ortak paydaya gidiyordur.
Mark Ransom

Unidecode, kesinlikle dilden bağımsız çözüm için geçerli. Alman merkezli bir çözüm s/ö/oe/için, geri kalanıyla temizlemeden önce uygulanabilir karakterleri manuel olarak ( vb.) Dönüştürün unidecode.
alexis

4
Nitekim, Fince, örneğin ä -> a, ö -> odüpedüz yanlıştır, bu hala tercih edilir aeveoe
Antti Haapala

25

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.normalizebu unicode.decompositioniş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.translatebunun yerine noktalama karakterleriyle uğraşmak için kullanabilirsiniz . translateYö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.normalizebu karakterlerle uğraşmak.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.