Wo ist Pythons "beste ASCII für diese Unicode" -Datenbank?

84

Ich habe Text, der Unicode-Interpunktion verwendet, wie z. B. linkes doppeltes Anführungszeichen, rechtes einfaches Anführungszeichen für Apostroph usw., und ich benötige ihn in ASCII. Verfügt Python über eine Datenbank dieser Zeichen mit offensichtlichen ASCII-Ersatzzeichen, sodass ich es besser machen kann, als sie alle in "?" ?

Joeforker
quelle
21
Du bist ein tapferer Krieger. Unicode ist Pythons Erzfeind.
David Berger
2
Personen, die dies finden, könnten interessiert sein an Was ist der beste Weg, um Akzente in einer Python-Unicode-Zeichenfolge zu entfernen?
Martin Thoma

Antworten:

88

Unidecode sieht aus wie eine Komplettlösung. Es konvertiert ausgefallene Anführungszeichen in ASCII-Anführungszeichen, lateinische Zeichen mit Akzent in nicht akzentuierte Anführungszeichen und versucht sogar, mit Zeichen zu arbeiten, die keine ASCII-Entsprechungen haben. Auf diese Weise müssen Ihre Benutzer nicht viele sehen? wenn Sie ihren Text durch ein altes 7-Bit-ASCII-System leiten mussten.

>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing 

http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

Joeforker
quelle
3
Hm .. deutsche Umlaute werden in ihren
Grundcharakter
4
@ThiefMaster sind diese Entsprechungen in allen Sprachen wahr? Vielleicht wird Unidecode für den kleinsten gemeinsamen Nenner verwendet.
Mark Ransom
Unidecode ist mit Sicherheit die sprachunabhängige Lösung. Konvertieren Sie für eine deutschzentrierte Lösung die entsprechenden Zeichen manuell ( s/ö/oe/usw.), bevor Sie den Rest mit bereinigen unidecode.
Alexis
4
Tatsächlich, zum Beispiel in der finnischen, während ä -> a, ö -> ovöllig falsch ist, ist es immer noch besser, aeundoe
Antti Haapala
25

In meiner ursprünglichen Antwort schlug ich auch vor unicodedata.normalize. Ich habe mich jedoch entschlossen, es auszuprobieren, und es stellte sich heraus, dass es mit Unicode-Anführungszeichen nicht funktioniert. Es macht einen guten Job beim Übersetzen von Unicode-Zeichen mit Akzent, daher schätze ich, dass es unicodedata.normalizemit der unicode.decompositionFunktion implementiert wird , was mich zu der Annahme führt, dass es wahrscheinlich nur Unicode-Zeichen verarbeiten kann, die Kombinationen aus Buchstaben und diakritischen Zeichen sind, aber ich bin es nicht wirklich ein Experte für die Unicode-Spezifikation, also könnte ich einfach voller heißer Luft sein ...

In jedem Fall können Sie unicode.translatestattdessen Interpunktionszeichen verwenden. Die translateMethode verwendet ein Wörterbuch von Unicode-Ordnungszahlen zu Unicode-Ordnungszahlen. Daher können Sie eine Zuordnung erstellen, die nur Unicode-Interpunktion in ASCII-kompatible Interpunktion übersetzt:

'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 bei Bedarf weitere Interpunktionszuordnungen hinzufügen, aber ich denke, Sie müssen sich nicht unbedingt um die Behandlung jedes einzelnen Unicode-Interpunktionszeichens kümmern. Wenn Sie tun , um Griff Akzente und andere diakritische Zeichen benötigen, können Sie immer noch verwenden , unicodedata.normalizemit diesen Zeichen zu behandeln.

Mike Spross
quelle
21

Interessante Frage.

Google hat mir geholfen, diese Seite zu finden, die mit dem Unicodedata-Modul wie folgt beschrieben wird:

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
Staffelei
quelle
3

Weitere Informationen hierzu finden Sie unter http://code.activestate.com/recipes/251871/. Dort finden Sie die NFKD-Lösung und einige Möglichkeiten zum Erstellen einer Konvertierungstabelle für Dinge wie ± => +/- und andere Nicht-Buchstaben-Zeichen.

Andrew Dalke
quelle