Wo ist Python „best ASCII für diese Unicode“ Datenbank?
Frage
Ich habe einen Text, die Unicode-Interpunktion verwendet, wie links doppelte Anführungszeichen, rechts Apostroph für Apostroph, und so weiter, und ich brauche es in ASCII. Hat Python haben eine Datenbank dieser Zeichen mit der Hand ASCII ersetzt, so kann ich es besser machen als sie alle in drehen „?“ ?
Lösung
Unidecode sieht aus wie eine komplette Lösung. Es wandelt Phantasie Anführungszeichen ascii zitiert, betont lateinische Buchstaben zu unbetonten und sogar versucht Umschrift mit Zeichen zu behandeln, die nicht ASCII-Äquivalente haben. Auf diese Weise Ihre Benutzer müssen nicht einen Haufen sehen? wenn Sie hat ihren Text durch ein Vermächtnis 7-Bit-ASCII-System zu übergeben.
>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing
http://www.tablix.org/~avian / Blog / Archiv / 2009/01 / unicode_transliteration_in_python /
Andere Tipps
In meiner ursprünglichen Antwort, schlug ich vor, auch unicodedata.normalize
. Allerdings habe ich beschlossen, es zu testen und es stellt sich heraus, dass es nicht mit Unicode-Anführungszeichen funktioniert. Es macht einen guten Job mit Akzente Unicode-Zeichen zu übersetzen, so vermute ich, unicodedata.normalize
wird mit der unicode.decomposition
Funktion implementiert, die mich wahrscheinlich nur Unicode-Zeichen verarbeiten kann, zu glauben, führt die Kombinationen aus einem Buchstaben und ein diakritischen Zeichen sind, aber ich bin nicht wirklich ein Experte auf der Unicode-Spezifikation, so konnte ich nur aus heißer Luft voll ...
In jedem Fall können Sie unicode.translate
verwenden, anstatt mit Satzzeichen zu behandeln. Die translate
Methode nimmt ein Wörterbuch von Unicode ordinals in Unicode ordinals, so können Sie eine Zuordnung erstellen, die Unicode nur übersetzt Interpunktion in ASCII-kompatible Zeichensetzung:
'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!"'
Sie können mehr Interpunktion Mappings wenn nötig, aber ich glaube nicht, dass Sie unbedingt jede einzelne Unicode über den Umgang mit Interpunktionszeichen kümmern müssen. Wenn Sie tun müssen Akzente und andere diakritische Zeichen behandeln, können Sie immer noch unicodedata.normalize
mit diesen Zeichen umgehen können.
Interessante Frage.
Google hat mir geholfen, finden diese Seite , die die unicodedata Modul wie die folgenden:
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
Es gibt weitere Diskussion über diese unter http://code.activestate.com/recipes/251871/ , die hat die NFKD Lösung und einige Möglichkeiten, eine Umrechnungstabelle zu tun, für Dinge wie ± => +/- und andere nicht-Buchstaben-Zeichen.