我认为,对该主题进行了几次讨论,但对我来说仍然不清楚。 首先,我从一个二手操作系统开始:我在Ubuntu 16.04 LTS的远程Shell上工作。 / 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
一切正常。
因此,我要使用uwsgi运行我的Django应用程序(无论是否在virtualenv中运行它)。 在* .ini文件(配置)上,我阻止了:
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)
如果 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编码。