要检查的东西
以下是我的发现,为了让我推荐检查它们:
-
环境变量
LC_ALL
,
LANG
,
LC_CTYPE
,
LANGUAGE
-
特定于Python的环境变量
PYTHONIOENCODING
,
PYTHONCOERCECLOCALE
(其影响可能受到程序参数的影响
-E
;可以检查
sys.flags.ignore_environment
)
-
特定于Windows的控制台编码
PYTHONLEGACYWINDOWSSTDIO
-
蟒蛇
sys
模块
-
功能
sys.getdefaultencoding()
(推论函数
sys.setdefaultencoding
已从Python 3中删除)
-
sys.stdin.encoding
-
sys.stdout.encoding
-
sys.stderr.encoding
-
文件系统编码设置
sys.getfilesystemencoding()
-
Python文件头
-*- coding: utf-8 -*-
-
locale
模块
-
函数调用
locale.nl_langinfo(locale.CODESET)
(似乎不适用于WindowsPython3.7,适用于DebianPython3.5)
-
功能
locale.getdefaultlocale
-
功能
locale.getpreferredencoding
(在某些系统上的工作方式不同)
-
gettext
模块和它的各种设施(我不会一一列举)
-
传递给某些函数的目录的内容,如
gettext.install(application, directory)
或
gettext.bindtextdomain(domain, directory)
打印值
下面是列出其中大多数值的快速脚本:
import os, sys, locale
print('environment:')
print('-E (ignore PYTHON* environment variables) ? %s' %
(True if sys.flags.ignore_environment else False))
for env in ('LC_ALL', 'LANG', 'LC_CTYPE',
'LANGUAGE', 'PYTHONIOENCODING',
'PYTHONLEGACYWINDOWSSTDIO'):
if env in os.environ:
print('"%s"="%s"' % (env, os.environ[env]))
else:
print('"%s" not set' % env)
print()
print('sys module:')
print('getdefaultencoding "%s"' % sys.getdefaultencoding())
print('sys.stdin.encoding "%s"' % sys.stdin.encoding)
print('sys.stdout.encoding "%s"' % sys.stdout.encoding)
print('sys.stderr.encoding "%s"' % sys.stderr.encoding)
print()
print('locale:')
try:
getattr(locale,'nl_langinfo')
print('locale.nl_langinfo(locale.CODESET) "%s"' \
% locale.nl_langinfo(locale.CODESET))
except AttributeError:
print('locale.nl_langinfo not available')
print('locale.getdefaultlocale()[1] "%s"' \
% locale.getdefaultlocale()[1])
print('locale.getpreferredencoding() "%s"' \
% locale.getpreferredencoding())
三种系统上的打印值
-
Windows 10和3.7
-
Debian 9和3.5
-
Ubuntu14和3.4
在使用Python 3.7的Windows 10上,这个
environment:
-E (ignore PYTHON* environment variables) ? False
"LC_ALL" not set
"LANG" not set
"LC_CTYPE" not set
"LANGUAGE" not set
"PYTHONIOENCODING"="UTF-8"
"PYTHONLEGACYWINDOWSSTDIO" not set
sys module:
getdefaultencoding "utf-8"
sys.stdin.encoding "UTF-8"
sys.stdout.encoding "UTF-8"
sys.stderr.encoding "UTF-8"
locale:
locale.nl_langinfo not available
locale.getdefaultlocale()[1] "cp1252"
locale.ngetpreferredencoding() "cp1252"
在使用Python3.5的Debian9上,这个
environment:
-E (ignore PYTHON* environment variables) ? False
"LC_ALL" not set
"LANG"="en_GB.UTF-8"
"LC_CTYPE" not set
"LANGUAGE" not set
"PYTHONIOENCODING" not set
"PYTHONLEGACYWINDOWSSTDIO" not set
sys module:
getdefaultencoding "utf-8"
sys.stdin.encoding "UTF-8"
sys.stdout.encoding "UTF-8"
sys.stderr.encoding "UTF-8"
locale:
locale.nl_langinfo(locale.CODESET) "UTF-8"
locale.getdefaultlocale()[1] "UTF-8"
locale.ngetpreferredencoding() "UTF-8"
在使用Python 3.4的Ubuntu 14.04上,这个
environment:
-E (ignore PYTHON* environment variables) ? False
"LC_ALL" not set
"LANG"="en_US.UTF-8"
"LC_CTYPE" not set
"LANGUAGE"="en_US:"
"PYTHONIOENCODING" not set
"PYTHONLEGACYWINDOWSSTDIO" not set
sys module:
getdefaultencoding "utf-8"
sys.stdin.encoding "UTF-8"
sys.stdout.encoding "UTF-8"
sys.stderr.encoding "UTF-8"
locale:
locale.nl_langinfo(locale.CODESET) "UTF-8"
locale.getdefaultlocale()[1] "UTF-8"
locale.getpreferredencoding() "UTF-8"
不幸的是,当我遇到已安装模块的unicode打印问题时,不清楚哪个设置正在影响该模块。因此,理解这些不同的可能参数和设置是如何相互作用的更加令人困惑。有许多设置组合要测试。
但这一点可能有助于某人开始。
也可以在SO问题上看到有用的答案
How to set sys.stdout encoding in Python 3?
.
相关政治公众人物审查
一些来自
this pymotw article
,
python how-to unicode
,
python sys module
,
python locale module
.