Frage

Dies ist in Python 2.4. Hier ist meine Situation. Ich ziehe eine Zeichenfolge aus einer Datenbank, und es enthält einen Umlaut ‚o‘ (\ XF6). An diesem Punkt, wenn ich Typ (Wert) laufen gibt es str. Ich versuche dann zu laufen .decode ( ‚UTF-8‘), und ich erhalte eine Fehlermeldung ( ‚UTF-8‘ Codec kann nicht Bytes in Position dekodieren 1-4).

Wirklich mein Ziel hier ist nur erfolgreich Typ (Wert) return Unicode zu machen. Ich fand eine frühere Frage das hatte einige nützlichen Informationen, aber das Beispiel aus der aufgenommenen Antwort scheint nicht für mich zu laufen. Gibt es etwas, was ich hier falsch mache?

Hier ist ein Code zu reproduzieren:

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

Ich habe nie wirklich an die Schreib Aussage, weil es auf der ersten Anweisung schlägt fehl.

Vielen Dank für Ihre Hilfe.

Edit:

ich festgestellt, dass die DB charset utf8 ist. Also in meinem Code zu reproduzieren ich geändert ‚\ XF6‘ auf ‚\ xc3 \ XB6‘, und das Scheitern immer noch auftritt. Gibt es einen Unterschied zwischen ‚UTF-8‘ und ‚UTF-8‘?

Die Spitze Codecs in eine Datei zu schreiben, über die Verwendung ist praktisch (Ich werde es auf jeden Fall verwenden), aber in diesem Szenario bin ich nur für Debugging-Zwecke in eine Protokolldatei geschrieben werden.

War es hilfreich?

Lösung

  

Also in meinem Code zu reproduzieren ich geändert '\ XF6' auf '\ xc3 \ XB6', und der Fehler immer noch auftritt

Nicht in der ersten Zeile es nicht:

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

Die zweite Zeile wird jedoch Fehler aus:

>>> 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)

Welche ist ganz was man erwarten würde, versuchen, Nicht-ASCII-Unicode-Zeichen in einem Byte-Stream zu schreiben. Wenn Sie Jiri Vorschlag eines Codecs umwickelten Strom verwenden, können Sie Unicode direkt schreiben, sonst müssen Sie den Unicode-String in Bytes manuell neu kodieren.

Besser, zur Protokollierung, würde einfach sein, eine repr auszuspucken () der Variablen. Dann sind Sie nicht über Unicode-Zeichen kümmern müssen dort sein, oder Zeilenumbrüche oder andere unerwünschte Zeichen:

name= 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %r\n' % name)

Name: u'w\xf6rner'

Andere Tipps

Ihre Zeichenfolge nicht in UTF8-Codierung. Wenn Sie möchten Zeichenfolge in Unicode ‚entschlüsseln‘, muss die Zeichenfolge in kodieren Sie durch Parameter angegeben werden. Ich versuchte dies und es funktioniert perfekt:

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

Bearbeiten

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 der Eingabe / Ausgabe zu spezifizieren und ‚unicode‘ Zeichenfolge im gesamten Code verwenden, ohne von verschiedenen Kodierungen stören.

Es ist offensichtlich 1-Byte-Codierung. 'Ö' in UTF-8 '\ xc3 \ XB6'.

Die Codierung könnte sein:

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

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 verwendet 2 Bytes für etwas außerhalb ascii zu entkommen, aber hier ist es nur 1 Byte, so iso-8859-1 ist wahrscheinlich richtig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top