Возможность запуска кода Python с помощью строки Unicode в Eclipse, но получение UnicodeEncodeError при работе через командную строку или Idle.

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

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

РЕДАКТИРОВАТЬ:

Пример:

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

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

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

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

Строки байтов DECODED в строки Unicode.

Строки Unicode ENCODED в байтовые строки.

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

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

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

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

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

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