webentwicklung-frage-antwort-db.com.de

Verarbeiten Sie falsch codierte Zeichen in Python-Unicode-Zeichenfolgen

Ich habe es mit Unicode-Strings zu tun, die von der python-lastfm-Bibliothek zurückgegeben werden.

Ich gehe davon aus, dass irgendwo auf dem Weg die Bibliothek die Kodierung falsch macht und eine Unicode-Zeichenfolge zurückgibt, die möglicherweise ungültige Zeichen enthält.

Zum Beispiel ist die ursprüngliche Zeichenfolge, die ich in der Variablen a erwarte, "Glück".

 >>> ein 
 u'Gl\xfcck '
 >>> ein 
 Traceback ausgeben (letzter Aufruf zuletzt): 
 File " ", Zeile 1, in 
 UnicodeEncodeError: Der ASCII-Codec kann das Zeichen u '\ xfc' an Position 2 nicht codieren: Ordinal nicht im Bereich (128) 

\ xfc ist der maskierte Wert 252, der der latin1-Codierung von "ü" entspricht. Irgendwie wird dies in die Unicode-Zeichenfolge eingebettet, so dass Python nicht alleine damit umgehen kann.

Wie konvertiere ich diese zurück eine normale oder Unicode-Zeichenfolge, die das ursprüngliche "Glück" enthält? Ich habe versucht, mit den Decode/Encode-Methoden herumzuspielen, aber entweder einen UnicodeEncodeError oder einen String mit der Sequenz\xfc.

14
strfry

Ihre Unicode-Zeichenfolge ist in Ordnung:

>>> unicodedata.name(u"\xfc")
'LATIN SMALL LETTER U WITH DIAERESIS'

Das Problem, das Sie an der interaktiven Eingabeaufforderung sehen, ist, dass der Interpreter nicht weiß, welche Codierung für die Ausgabe der Zeichenfolge an Ihr Terminal verwendet werden soll. Daher wird auf den Codec "ascii" zurückgegriffen. Dieser Codec kann jedoch nur mit _ umgehen.ASCII Zeichen. Auf meinem Computer funktioniert es einwandfrei (weil sys.stdout.encoding für mich "UTF-8" ist - wahrscheinlich, weil sich die Einstellungen meiner Umgebungsvariablen von Ihren unterscheiden).

>>> print u'Gl\xfcck'
Glück
7
Croad Langshan

Sie müssen Ihre Unicode-Zeichenfolge in eine Standardzeichenfolge konvertieren, indem Sie eine Codierung verwenden, z. utf-8:

some_unicode_string.encode('utf-8')

Abgesehen davon: Dies ist ein Betrug von

BeautifulSoup findall mit Klassenattribut-Unicode-Codierungsfehler

und mindestens zehn weitere verwandte Fragen zu SO. Forschung zuerst.

12
Andreas Jung

Fügen Sie am Anfang Ihres Codes, unmittelbar nach dem Import, diese 3 Zeilen hinzu.

import sys  # import sys package, if not already imported
reload(sys)
sys.setdefaultencoding('utf-8')

Es überschreibt die Systemstandardcodierung (ASCII) für den Verlauf Ihres Programms.

Bearbeiten: Sie sollten dies nicht tun, es sei denn, Sie sind sich der Konsequenzen sicher, siehe Kommentar unten. Dieser Beitrag ist auch hilfreich: Gefahren von sys.setdefaultencoding ('utf-8')

4
az3

Verwenden Sie str () nicht, um das, was Sie aus Modellfeldern erhalten haben, zu stringgen, solange es sich bereits um einen Unicode-String handelt. (oops ich habe total verpasst, dass es nicht mit Django zu tun hat)

0
Artie