Dekodowanie Pythona Unicode nie jest obsługiwane

81

Mam problem z kodowaniem w Pythonie. Próbowałem różnych metod, ale nie mogę znaleźć najlepszego sposobu na zakodowanie mojego wyjścia do UTF-8.

Oto, co próbuję zrobić:

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

searchGooglezwraca pierwszy wynik Google dla zapytania param.

Oto błąd, który otrzymuję:

exceptions.TypeError: decoding Unicode is not supported

Czy ktoś wie, jak mogę sprawić, by Python zakodował moje dane wyjściowe w UTF-8, aby uniknąć tego błędu?

simonbs
źródło

Odpowiedzi:

102

Wygląda na to, że google.searchGoogle(param)już zwraca 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

Więc chcesz:

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

Na marginesie, twój kod oczekuje, że zwróci utf-8zakodowany ciąg, więc jaki był sens w dekodowaniu go (użyciu unicode()) i kodowaniu z powrotem (używaniu .encode()) przy użyciu tego samego kodowania?

jak
źródło
4
Szczerze mówiąc, po unicode()prostu wygłupiałem się, próbując zrozumieć, co się dzieje. Dziękuję bardzo :-)
simonbs
2
Teraz czasami dostanę ascii' codec can't decode byte 0xc3 in position. Czy wiesz, dlaczego tak jest?
simonbs
2
W linii, którą zaproponowałem? Wówczas oznaczałoby to, że funkcja searchGoogle () zwróciła ciąg znaków z bajtem 0xC3. Wywołanie .encode()tego powoduje, że Python próbuje najpierw przekonwertować na Unicode (używając kodowania ascii). Nie wiem, dlaczego funkcja searchGoogle () czasami zwracała kod Unicode, a czasami ciąg znaków. Może to zależy od tego, co mu oddasz param? Staraj się trzymać jednego typu.
jaka
66
Żałuję, że nie ma bezpiecznego i prostego sposobu przesyłania na Unicode.
Eric Walker
@EricWalker Możesz napisać niezręczną funkcję pomocniczą, taką jak def uors2u(object, encoding=..., errors=...)która zwróci objectniezmieniony parametr, jeśli jest już w Unicode, lub przekonwertuje go, jeśli str. Jednak ten kod pachnie. Powinieneś konwertować wszystkie dane wejściowe do Unicode, gdy tylko otrzymasz je z zewnątrz (jak system plików) i przekonwertować je z powrotem, jeśli to konieczne, przed odesłaniem. Powinno być tylko jedno miejsce, w którym konwertujesz str na Unicode, więc funkcja pomocnicza, taka jak ta, którą opisałem, nie powinna być potrzebna.
Leonid