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 „?“ ?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top