gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:02:39 25 4
gpt4 key购买 nike

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

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

有些事情不是最重要的:

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

我还忘记了什么?


我只对 python 3 感兴趣。

最佳答案

检查事项

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

  • 环境变量 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:,如 # -*- 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

在内置 PowerShell 终端中使用 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 article 的一些帮助, python how-to unicode , python sys module , python locale module .

关于python - 影响编码、解码和打印的 python 设置列表是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54625182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com