Я думаю, что эта тема обсуждалась несколько раз, но для меня все еще неясно.Во-первых, я начинаю с используемой ОС: я работаю на удаленной оболочке, на Ubuntu 16.04 LTS./ etc / default / locale ниже:
# File generated by update-locale
LANG=en_US.UTF-8
#LANG=pl_PL.UTF-8
#LANGUAGE=POSIX
У меня есть некоторый файл py: test4.py
# -*- coding: utf-8 -*-
import sys
va = sys.getfilesystemencoding()
print('File system encoding')
print(va)
vb = sys.getdefaultencoding()
print('Default encoding')
print(vb)
dict = {'foo' : 'bar',
'cebula' : 'łąśćźżęó'
}
for key, value in dict.items():
print(key + ' : ' + value)
, когда я пытаюсь вызвать этот файл:
File system encoding
ascii
Default encoding
utf-8
foo : bar
Traceback (most recent call last):
File "test/test4.py", line 18, in <module>
print(key + ' : ' + value)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 9-16: ordinal not in range(128)
Если перед вызовом скрипта я использую:
export PYTHONIOENCODING=UTF-8
, а затем запускаю скрипт:
File system encoding
ascii
Default encoding
utf-8
cebula : łąśćźżęó
foo : bar
Все работает хорошо.
Итак, я собираюсь запустить приложение Django с использованием uwsgi (не важно, запускаю я его в virtualenv или нет).В * .ini файле (config) у меня есть блок:
env = PYTHONIOENCODING=UTF-8
Код скрипта (вырезано, только для показа происходящего):
# -*- coding: utf-8 -*-
def command(request):
if request.method == 'POST':
for key, value in sorted(request.POST.items()):
print(key + ' : ' + value)
Если значение имеет буквы для конкретного языка (в данном случае - польского):
print(key + ' : ' + value)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)
Если я добавлю к uwsgi.ini следующие строки:
env = LC_ALL=pl_PL.UTF-8
ИЛИenv = LANG=pl_PL.utf-8
Приложение работает стабильно.
Вопросы:
a) Почему Python3 не нужно устанавливать эти локали, даже временные, но uwsgi нужны для их анализаправильно символы, специфичные для языка?
b) Какую функцию / метод следует использовать, когда я знаю, что переменные печати будут отображаться в терминале (как указано выше), и они будут содержать символы, специфичные для языка.Я хочу остаться с кодировкой en_US.UTF-8.