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

问题描述 投票:0回答:1

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

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

有些事情是最重要的:

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

还有什么我忘了?

我只对python 3感兴趣。

python unicode localization python-unicode utf
1个回答
1
投票

要检查的事情

以下是我发现的内容,按照我建议的方式进行检查:

  • 环境变量LC_ALLLANGLC_CTYPELANGUAGE
  • 特定于Python的环境变量qazxsw poi,qazxsw poi (其效果可能会受到程序参数PYTHONIOENCODING的影响;可以检查PYTHONCOERCECLOCALE) 特定于Windows的控制台编码-E
  • Python sys.flags.ignore_environment模块 函数PYTHONLEGACYWINDOWSSTDIO(推论函数sys已从Python 3中删除) sys.getdefaultencoding() sys.setdefaultencoding sys.stdin.encoding 文件系统编码设置sys.stdout.encoding
  • Python文件头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.getpreferredencodinggettext

打印值

以下是列出大多数值的快速脚本:

gettext.install(application, directory)

printed values on three systems

  • Windows 10 3.7
  • Debian 9 3.5
  • Ubuntu 14与3.4

在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" 的有用答案。

要审查的相关PEP

  • 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?
  • PEP 540 -- Add a new UTF-8 Mode(环境变量python -X UTF8 ...

一些帮助来自PEP 529 -- Change Windows filesystem encoding to UTF-8PYTHONLEGACYWINDOWSFSENCODINGthis pymotw articlepython how-to unicode

© www.soinside.com 2019 - 2024. All rights reserved.