Python-Dekodierung Unicode wird nicht unterstützt

81

Ich habe ein Problem mit meiner Codierung in Python. Ich habe verschiedene Methoden ausprobiert, aber ich kann anscheinend nicht den besten Weg finden, meine Ausgabe in UTF-8 zu codieren.

Das versuche ich zu tun:

result = unicode(google.searchGoogle(param), "utf-8").encode("utf-8")

searchGoogleGibt das erste Google-Ergebnis für zurück param.

Dies ist der Fehler, den ich bekomme:

exceptions.TypeError: decoding Unicode is not supported

Weiß jemand, wie ich Python dazu bringen kann, meine Ausgabe in UTF-8 zu codieren, um diesen Fehler zu vermeiden?

simonbs
quelle

Antworten:

102

Sieht aus wie google.searchGoogle(param)schon zurück unicode:

>>> unicode(u'foo', 'utf-8')

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    unicode(u'foo', 'utf-8')
TypeError: decoding Unicode is not supported

Was Sie also wollen, ist:

result = google.searchGoogle(param).encode("utf-8")

Als Randnotiz erwartet Ihr Code, dass er eine utf-8codierte Zeichenfolge unicode()zurückgibt. Was war also der Sinn beim Decodieren (Verwenden ) und Zurückcodieren (Verwenden .encode()) mit derselben Codierung?

Yak
quelle
4
Ehrlich gesagt, der hat unicode()nur herumgespielt und versucht zu verstehen, was passiert ist. Vielen Dank :-)
Simonbs
2
Jetzt werde ich manchmal bekommen ascii' codec can't decode byte 0xc3 in position. Weißt du warum das so ist?
Simonbs
2
In der Zeile, die ich vorgeschlagen habe? Dann würde es bedeuten, dass searchGoogle () eine Zeichenfolge mit 0xC3 Byte zurückgibt. Wenn Sie dies .encode()aufrufen, versucht Python zuerst, in Unicode zu konvertieren (mithilfe der ASCII-Codierung). Ich weiß nicht, warum searchGoogle () manchmal Unicode und manchmal einen String zurückgibt. Vielleicht hängt es davon ab, was Sie geben param? Versuchen Sie, sich an einen Typ zu halten.
Yak
63
Ich wünschte, es gäbe eine sichere und einfache Möglichkeit, Unicode zu verwenden.
Eric Walker
@EricWalker Sie könnten eine umständliche Hilfsfunktion schreiben, def uors2u(object, encoding=..., errors=...)die objectparam unverändert zurückgibt, wenn es bereits in Unicode ist, oder es konvertieren, wenn str. Dieser Code riecht jedoch. Sie sollten alle Eingaben in Unicode konvertieren, sobald Sie sie von außen erhalten (wie ein Dateisystem), und sie bei Bedarf zurückkonvertieren, bevor Sie sie zurücksenden. Es sollte nur eine Stelle geben, an der Sie str in Unicode konvertieren, sodass eine Hilfsfunktion wie die von mir beschriebene nicht benötigt werden sollte.
Leonid