python3 UnicodeDecodeError при входе в консоль
Я просто портировал свое веб-приложение на python 3. Я разрабатываю на своем Mac и внедряю на сервере CentOS. Я нашел много UnicodeDecodeError
это не происходит в моей локальной тестовой среде, но они появляются на сервере развертывания (конечно:D)
Большинство из них я исправил, указав кодировку при открытии файлов. Однако есть одно место, где я не знаю, как указать кодировку, и это в журнале. Я все еще получаю ошибки, такие как:
UnicodeEncodeError: 'ascii' codec can't encode character '\xab' in position 85: ordinal not in range(128)
Та же проблема существовала (на обеих платформах) в Python 2, и она была решена с помощью этого
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Который изменил значение sys.getdefaultencoder()
от ascii
в utf-8
Но теперь в python3 sys.getdefaultencoder()
уже utf-8
по умолчанию ( Почему мы НЕ должны использовать sys.setdefaultencoding("utf-8") в сценарии py?), поэтому я не знаю, что вызывает эту разницу в поведении.
Так:
- что я должен искать, чтобы увидеть, почему обе платформы имеют разные значения по умолчанию для кодирования?
- как я могу решить это для регистрации?
1 ответ
Я нашел ответ здесь Python3 UnicodeDecodeError. Позвольте мне расширить:
Это решается установкой значения среды LC_CTYPE
в en_US.UTF-8
вместо UTF-8
, Это может быть установлено в .bashrc
:
export LC_CTYPE=en_US.UTF-8
Как ни странно, и мой Mac и сервер развертывания имеют LC_CTYPE=UTF-8
и в моем Mac это просто работает, но на сервере развертывания мне нужно установить его en_US.UTF-8
иначе это не сработает.
Но это похоже на странную конфигурацию с моего сервера развертывания, потому что, если я установлю его на UTF-8
жалуется вот так:
$ export LC_CTYPE=UTF-8
bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
(Мой Mac не жалуется)
Очевидно, что Python не читает LC_CTYPE
непосредственно, а скорее читая что-то еще (локаль?), которая устанавливается настройкой LC_CTYPE
,