Декодирование Python Unicode не поддерживается

81

У меня проблема с кодировкой на Python. Я пробовал разные методы, но не могу найти лучший способ закодировать свой вывод в UTF-8.

Вот что я пытаюсь сделать:

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

searchGoogleвозвращает первый результат Google для param.

Это ошибка, которую я получаю:

exceptions.TypeError: decoding Unicode is not supported

Кто-нибудь знает, как я могу заставить Python кодировать мой вывод в UTF-8, чтобы избежать этой ошибки?

Simonbs
источник

Ответы:

102

Похоже, google.searchGoogle(param)уже возвращается 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

Итак, что вы хотите:

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

В качестве примечания: ваш код ожидает, что он вернет utf-8закодированную строку, поэтому какой смысл в ее декодировании (использовании unicode()) и обратном кодировании (использовании .encode()) с использованием той же кодировки?

як
источник
4
Честно говоря, unicode()просто дурачился, пытаясь понять, что происходит. Большое спасибо :-)
simonbs 04
2
Теперь иногда попадаю ascii' codec can't decode byte 0xc3 in position. Вы знаете, почему это так?
simonbs
2
В строке, которую я предложил? Тогда это будет означать, что searchGoogle () вернул строку с байтом 0xC3. Вызов .encode()этого приводит к тому, что Python пытается сначала преобразовать в Unicode (с использованием кодировки ascii). Я не знаю, почему searchGoogle () иногда возвращает Unicode, а иногда и строку. Может это зависит от того, во что вы это даете param? Старайтесь придерживаться одного типа.
yak
66
Хотелось бы, чтобы был безопасный и простой способ преобразования в Unicode.
Эрик Уокер
@EricWalker Вы можете написать неудобную вспомогательную функцию, например, def uors2u(object, encoding=..., errors=...)которая будет возвращать objectпараметр без изменений, если он уже находится в Unicode, или преобразовать его, если str. Однако этот код пахнет. Вы должны конвертировать весь ввод в Unicode, как только вы получите его извне (например, файловую систему), и при необходимости конвертировать обратно, прежде чем отправлять обратно. Должно быть только одно место, где вы конвертируете str в unicode, поэтому вспомогательная функция, подобная той, которую я описал, не нужна.
Леонид