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.