Может запускать код Python со строкой Unicode в Eclipse, но получает UnicodeEncodeError при запуске через командную строку или в режиме ожидания. - PullRequest
3 голосов
/ 17 августа 2011

Я часто сталкивался с этим, когда я буду декодировать / кодировать некоторую строку Unicode в Eclipse (PyDev), и она работает нормально, как я и ожидал, но потом, когда я запускаю тот же скрипт из командной строки ( например) вместо этого я получу ошибки кодирования.

Есть ли простое объяснение этому? Eclipse что-то делает с Юникодом или каким-то другим образом манипулирует им?

EDIT:

Пример:

value = u'\u2019'.decode( 'utf-8', 'ignore' )
return value

Это работает в Eclipse (PyDev), но не в том случае, если я запускаю его в режиме ожидания или в командной строке.

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ u2019' в позиции 135: порядковый номер не в диапазоне (128)

Ответы [ 2 ]

9 голосов
/ 18 августа 2011

Просто хотел добавить, почему он работает на PyDev: у него есть специальная настройка сайта, которая настраивает python через sys.setdefaultencoding для использования кодировки консоли PyDev.

Обратите внимание, что ответ от bobince правильный, если у вас есть строка в кодировке Юникод, вы должны использовать метод encode (), чтобы преобразовать ее в правильную строку (вы будете использовать декодирование, если у вас есть строка и вы хотите преобразовать ее в кодировку Юникод).

8 голосов
/ 17 августа 2011
value = u'\u2019'.decode( 'utf-8', 'ignore' )

Строки байтов ДЕКОДИРОВАНЫ в строки Юникода.

Строки Юникода ВКЛЮЧЕНЫ в строки байтов.

Так что, если вы скажете someunicodestring.decode, он попытается привести строку Юникода кстрока байтов, чтобы иметь возможность декодировать ее (обратно в Unicode!).Будучи неявным преобразованием, этот шаг кодирования будет иметь значение для кодировки по умолчанию, которая может отличаться в разных средах и, вероятно, будет «безопасным» значением ascii, что, безусловно, приведет к ошибке, которую вы упомянули, поскольку ASCII не может содержатьперсонаж U + 2019.Почти никогда не стоит полагаться на кодировку по умолчанию.

Так что не имеет смысла пытаться decode строка Unicode.Я почти уверен, что вы имеете в виду:

value = u'\u2019'.encode('utf-8')

(ignore является избыточным для кодирования в UTF-8, поскольку нет символа, который эта кодировка не может представлять.)

...