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 "?" ?


21
Du bist ein tapferer Krieger. Unicode ist Pythons Erzfeind.
David Berger

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/


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.



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.