代码之家  ›  专栏  ›  技术社区  ›  JamesThomasMoon

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

  •  0
  • JamesThomasMoon  · 技术社区  · 6 年前

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

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

    有些事情让人难以忘怀:

    • 一般环境变量 LC_ALL , LANG
    • 蟒蛇 sys 模块设置 sys.getdefaultencoding()

    我还忘了什么?


    我只对python 3感兴趣。

    1 回复  |  直到 6 年前
        1
  •  1
  •   JamesThomasMoon    6 年前

    要检查的东西

    以下是我的发现,为了让我推荐检查它们:

    • 环境变量 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 .