Вопрос-Ответ

Changing default encoding of Python?

Изменение кодировки Python по умолчанию?

У меня много проблем "не удается закодировать" и "не удается декодировать" с Python, когда я запускаю свои приложения из консоли. Но в IDE Eclipse PyDev кодировкой символов по умолчанию установлено значение UTF-8, и я в порядке.

Я искал кодировку по умолчанию, и люди говорят, что Python удаляет sys.setdefaultencoding функцию при запуске, и мы не можем ее использовать.

Итак, какое лучшее решение для этого?

Переведено автоматически
Ответ 1

Вот более простой метод (взлом), который возвращает вам setdefaultencoding() функцию, которая была удалена из sys:

import sys
# sys.setdefaultencoding() does not exist, here!
reload(sys) # Reload does the trick!
sys.setdefaultencoding('UTF8')

(Примечание для Python 3.4+: reload() находится в importlib библиотеке.)

Однако делать это небезопасно: очевидно, что это взлом, поскольку sys.setdefaultencoding() намеренно удаляется из sys при запуске Python. Повторное включение и изменение кодировки по умолчанию может нарушить работу кода, который использует ASCII по умолчанию (этот код может быть сторонним, что обычно делает его исправление невозможным или опасным).

PS: Похоже, этот взлом больше не работает с Python 3.9.

Ответ 2

Если вы получаете эту ошибку при попытке передать / перенаправить вывод вашего скрипта


Ошибка UnicodeEncodeError: кодек 'ascii' не может кодировать символы в позиции 0-5: порядковый номер не входит в диапазон (128)


Просто экспортируйте PYTHONIOENCODING в консоль, а затем запустите свой код.

export PYTHONIOENCODING=utf8
Ответ 3

A) Для управления sys.getdefaultencoding() выводом:

python -c 'import sys; print(sys.getdefaultencoding())'

ascii

Затем

echo "import sys; sys.setdefaultencoding('utf-16-be')" > sitecustomize.py

и

PYTHONPATH=".:$PYTHONPATH" python -c 'import sys; print(sys.getdefaultencoding())'

utf-16-be

Вы могли бы указать свой sitecustomize.py выше в своем PYTHONPATH.

Также вы могли бы попробовать reload(sys).setdefaultencoding от @EOL

Б) Для управления stdin.encoding и stdout.encoding вы хотите установить PYTHONIOENCODING:

python -c 'import sys; print(sys.stdin.encoding, sys.stdout.encoding)'

ascii ascii

Затем

PYTHONIOENCODING="utf-16-be" python -c 'import sys; 
print(sys.stdin.encoding, sys.stdout.encoding)'

utf-16-be utf-16-be

Наконец: вы можете использовать A) или B) или оба!

Ответ 4

Начиная с PyDev 3.4.1, кодировка по умолчанию больше не изменяется. Подробности смотрите в этом тикете.

Для более ранних версий решение состоит в том, чтобы убедиться, что PyDev не запускается с UTF-8 в качестве кодировки по умолчанию. В Eclipse запустите диалоговое окно настроек ("запустить конфигурации", если я правильно помню); вы можете выбрать кодировку по умолчанию на вкладке "Общие". Измените ее на US-ASCII, если вы хотите, чтобы эти ошибки появлялись "раньше" (другими словами: в вашей среде PyDev). Также смотрите оригинальное сообщение в блоге об этом обходном пути.

2023-04-24 06:11 python