影响编码,解码和打印的python设置列表是什么?

时间:2019-02-11 06:44:27

标签: python unicode localization python-unicode utf

当我遇到unicode打印问题时,我想知道应该检查什么。在我的情况下,我使用的是已安装的模块,该模块使用错误的编解码器打印Unicode编码的字符。

在各种情况下,有几个不同的地方会影响python的编码和解码。特别是python在不同情况下如何处理可打印数据。

有些事不在意:

  • 一般环境变量LC_ALLLANG
  • Python sys模块设置sys.getdefaultencoding()

我还忘记了什么?


我只对python 3感兴趣。

1 个答案:

答案 0 :(得分:1)

要检查的东西

以下是我发现的内容,按照建议对它们进行检查的顺序:

  • 环境变量LC_ALLLANGLC_CTYPELANGUAGE
  • 特定于Python的环境变量PYTHONIOENCODINGPYTHONCOERCECLOCALE
    (其影响可能受到程序参数-E的影响;可以检查sys.flags.ignore_environment
    • 特定于Windows的控制台编码PYTHONLEGACYWINDOWSSTDIO
  • Python 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)(在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())


在三个系统上打印值

  • 带有3.7的Windows 10
  • Debian 9 with 3.5
  • Ubuntu 14 with 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"

在使用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?

要审核的相关PEP


this pymotw articlepython how-to unicodepython sys modulepython locale module的一些帮助。