【问题标题】:What is the list of python settings that affect encoding, decoding, and printing?影响编码、解码和打印的 python 设置列表是什么?
【发布时间】:2019-07-04 15:07:16
【问题描述】:

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

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

有些事情没有想到:

  • 通用环境变量LC_ALL,LANG
  • Python sys 模块设置sys.getdefaultencoding()

我还忘了什么?


我只对 python 3 感兴趣。

【问题讨论】:

    标签: python unicode localization python-unicode utf


    【解决方案1】:

    检查事项

    这是我发现的,按照我推荐的检查方式排列:

    • 环境变量LC_ALLLANGLC_CTYPELANGUAGE
    • Python特有的环境变量PYTHONIOENCODING,PYTHONCOERCECLOCALE
      (其影响可能受程序参数-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())
    


    三个系统上的打印值

    • Windows 10 3.7
    • Debian 9 和 3.5
    • Ubuntu 14 和 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 Question How to set sys.stdout encoding in Python 3? 的有用答案。

    需要审查的相关 PEP


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

    【讨论】:

      猜你喜欢
      • 2012-12-31
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 2017-06-26
      • 2015-10-03
      • 2019-04-28
      • 2019-10-08
      相关资源
      最近更新 更多