当我遇到unicode打印问题时,我想知道应该检查什么。在我的情况下,我使用的是已安装的模块,该模块使用错误的编解码器打印Unicode编码的字符。
在各种情况下,有几个不同的地方会影响python的编码和解码。特别是python在不同情况下如何处理可打印数据。
有些事不在意:
LC_ALL
,LANG
sys
模块设置sys.getdefaultencoding()
我还忘记了什么?
我只对python 3感兴趣。
答案 0 :(得分:1)
以下是我发现的内容,按照建议对它们进行检查的顺序:
LC_ALL
,LANG
,LC_CTYPE
,LANGUAGE
PYTHONIOENCODING
,PYTHONCOERCECLOCALE
-E
的影响;可以检查sys.flags.ignore_environment
)
PYTHONLEGACYWINDOWSSTDIO
sys
模块
sys.getdefaultencoding()
(推论函数sys.setdefaultencoding
已从Python 3中删除)sys.stdin.encoding
sys.stdout.encoding
sys.stderr.encoding
sys.getfilesystemencoding()
-*- coding: utf-8 -*-
locale
模块
locale.nl_langinfo(locale.CODESET)
(在Windows Python 3.7上似乎无效,在Debian Python 3.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())
在使用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"
在使用Python 3.5的Debian 9上,此打印内容
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?。
python -X UTF8 ...
)PYTHONLEGACYWINDOWSFSENCODING
)
this pymotw article,python how-to unicode,python sys module,python locale module的一些帮助。