2009-03-20 16 views
3

kann nicht dekodiert werden Dies ist in Python 2.4. Hier ist meine Situation. Ich ziehe eine Zeichenfolge aus einer Datenbank, und es enthält ein Umlaute 'o' (\ xf6). An diesem Punkt, wenn ich Typ (Wert) ausführen, gibt es str zurück. Ich versuche dann, .decode ('utf-8') auszuführen, und ich bekomme einen Fehler ('utf8' Codec kann Bytes in Position 1-4 nicht decodieren).Unicode-Zeichenfolge in Python 2.4

Wirklich mein Ziel hier ist nur erfolgreich Typ (Wert) Rückkehr Unicode. Ich fand eine earlier question , die einige nützliche Informationen hatte, aber das Beispiel aus der ausgewählten Antwort scheint nicht für mich zu laufen. Gibt es etwas, was ich hier falsch mache?

Hier einige Code zu reproduzieren:

Name = 'w\xc3\xb6rner'.decode('utf-8') 
file.write('Name: %s - %s\n' %(Name, type(Name))) 

ich an die Schreib Anweisung bekommen eigentlich nie, weil es auf der ersten Anweisung schlägt fehl.

Vielen Dank für Ihre Hilfe.

Edit:

ich festgestellt, dass die DB charset utf8 ist. In meinem zu reproduzierenden Code habe ich '\ xf6' in '\ xc3 \ xb6' geändert, und der Fehler tritt immer noch auf. Gibt es einen Unterschied zwischen "utf-8" und "utf8"?

Der Tipp auf Codecs zum Schreiben in eine Datei ist praktisch (ich werde es definitiv verwenden), aber in diesem Szenario schreibe ich nur in eine Protokolldatei für Debugging-Zwecke.

+0

Welchen Zeichensatz verwenden Sie in Ihrer Datenbanktabelle? Ich vermute es ist wahrscheinlich nicht utf-8. Versuchen Sie das stattdessen an 'decode' zu ​​übergeben. – elo80ka

Antwort

2

Also in meinem Code, den ich geändert '\ XF6' auf '\ xc3 \ XB6', und das Scheitern noch

Nicht in der es erste Zeile tritt zu reproduzieren nicht:

>>> 'w\xc3\xb6rner'.decode('utf-8') 
u'w\xf6rner' 

die zweite Zeile obwohl Fehler aus wird:

>>> file.write('Name: %s - %s\n' %(Name, type(Name))) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128) 

die vollständig ist, was man erwarten würde, versuchen, nicht-ASCII-Unicode-Zeichen in einem Byte-Stream zu schreiben. Wenn Sie den Vorschlag von Jiri für einen mit Codecs verpackten Stream verwenden, können Sie Unicode direkt schreiben, andernfalls müssen Sie die Unicode-Zeichenfolge manuell in Bytes umschlüsseln.

Besser, zum Protokollieren, wäre es einfach, ein repr() der Variable auszuspucken. Dann müssen Sie sich nicht darum kümmern, ob Unicode-Zeichen oder Zeilenumbrüche oder andere unerwünschte Zeichen enthalten sind:

3

Sie müssen "ISO-8859-1" verwenden:

Name = 'w\xf6rner'.decode('iso-8859-1') 
file.write('Name: %s - %s\n' %(Name, type(Name))) 

utf-8 2 Bytes verwendet für etwas außerhalb ascii zu entkommen, aber hier ist es nur 1 Byte, so iso-8859-1 ist wahrscheinlich richtig.

10

Ihre Zeichenfolge ist nicht in UTF8-Codierung. Wenn Sie die Zeichenfolge in Unicode "dekodieren" möchten, muss Ihre Zeichenfolge in der Codierung sein, die Sie durch den Parameter angegeben haben. Ich versuchte dies und es funktioniert perfekt:

print 'w\xf6rner'.decode('cp1250') 

EDIT

Für Unicode-Strings in die Datei schreiben Sie Codecs Modul verwenden können:

import codecs 
f = codecs.open("yourfile.txt", "w", "utf8") 
f.write(...) 

Es ist praktisch Codierung des spezifizieren Eingabe/Ausgabe und Verwendung von "Unicode" -String im gesamten Code, ohne verschiedene Kodierungen zu stören.

+0

+1 für 'import codecs' und' codecs.open() '. Tolles Zeug! – mknaf

5

Es ist offensichtlich 1-Byte-Codierung. 'ö' in UTF-8 ist '\ xc3 \ xb6'.

könnte die Codierung sein:

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • Win-1250
  • Win-1252