Декодування 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, щоб уникнути цієї помилки?

Відповіді:


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

2
Зараз я іноді отримаю ascii' codec can't decode byte 0xc3 in position. Чи знаєте ви, чому це так?
simonbs

2
У рядку, який я запропонував? Тоді це означало б, що searchGoogle () повернув рядок із байтом 0xC3. Виклик .encode()цього призводить до того, що Python намагається спочатку перетворити на unicode (використовуючи кодування ascii). Не знаю, чому searchGoogle () іноді повертає Unicode, а іноді рядок. Можливо, це залежить від того, що ви йому дасте param? Спробуйте дотримуватися одного типу.
Як

66
Я хотів би, щоб був безпечний, простий спосіб перекладу на Unicode.
Eric Walker,

@EricWalker Ви можете написати незграбну допоміжну функцію, наприклад, def uors2u(object, encoding=..., errors=...)яка поверне objectпараметр незмінним, якщо він уже є в Unicode, або перетворить його, якщо str. Однак цей код пахне. Вам слід перетворити всі введені дані в Unicode, як тільки ви отримаєте їх зовні (як файлова система), і перетворити їх назад, якщо потрібно, перед тим, як відправити їх назад. Там, де ви перетворюєте str в unicode, повинно бути лише одне місце, тому допоміжна функція, подібна до описаної мною, не потрібна.
Леонід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.