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,

Другие вопросы по тегам