当我遇到unicode打印问题时,我想知道应该检查什么。在我的特定情况下,我正在使用一个已安装的模块,该模块使用错误的编解码器打印unicode编码的字符。
在各种情况下,有几个不同的地方会影响python编码和解码。特别是python如何处理不同情况下的可打印数据。
有些事情是最重要的:
LC_ALL
,LANG
sys
模块设置sys.getdefaultencoding()
还有什么我忘了?
我只对python 3感兴趣。
以下是我发现的内容,按照我建议的方式进行检查:
LC_ALL
,LANG
,LC_CTYPE
,LANGUAGE
PYTHONIOENCODING
的影响;可以检查PYTHONCOERCECLOCALE
)
特定于Windows的控制台编码-E
sys.flags.ignore_environment
模块
函数PYTHONLEGACYWINDOWSSTDIO
(推论函数sys
已从Python 3中删除)
sys.getdefaultencoding()
sys.setdefaultencoding
sys.stdin.encoding
文件系统编码设置sys.stdout.encoding
sys.stderr.encoding
sys.getfilesystemencoding()
模块
函数调用-*- coding: utf-8 -*-
(似乎不适用于Windows Python 3.7,适用于Debian Python 3.5)
功能locale
功能locale.nl_langinfo(locale.CODESET)
(在某些系统上的工作方式不同)locale.getdefaultlocale
模块和它的各种设施(我不会全部列出)
传递给某些函数的目录的内容,如locale.getpreferredencoding
或gettext
以下是列出大多数值的快速脚本:
gettext.install(application, directory)
在Windows 10上使用Python 3.7,打印
gettext.bindtextdomain(domain, directory)
在Debian 9上使用Python 3.5进行打印
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.4的Ubuntu 14.04上打印
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"
不幸的是,当我遇到安装模块的unicode打印问题时,并不是很明显哪个设置正在影响该模块。同样,了解这些不同的可能参数和设置如何相互作用更加令人困惑。有许多设置组合要测试。
但这一点可能有助于某人开始。
另请参阅SO问题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"
的有用答案。
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"
(How to set sys.stdout encoding in Python 3?)python -X UTF8 ...
)一些帮助来自PEP 529 -- Change Windows filesystem encoding to UTF-8,PYTHONLEGACYWINDOWSFSENCODING
,this pymotw article,python how-to unicode。