首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python <3中将UTF-8编码的文本打印到控制台?

如何在Python <3中将UTF-8编码的文本打印到控制台?
EN

Stack Overflow用户
提问于 2018-09-17 05:58:15
回答 2查看 0关注 0票数 0

我正在运行一个最新的Linux系统,我的所有语言环境都是UTF-8:

LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
...
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

现在我想将UTF-8编码的内容写入控制台。

现在Python使用UTF-8进行FS编码,但坚持使用ASCII作为默认编码:-(

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'

我认为最好(干净)的方法是设置PYTHONIOENCODING环境变量。但似乎Python忽略了它。至少在我的系统上ascii,即使在设置了envvar之后,我仍然保持默认编码。

# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8

如果我在脚本的开头执行以下操作,它可以工作:

>>> import sys
>>> reload(sys)  # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'

但这种做法似乎不洁净。那么,实现这一目标的好方法是什么?

解决方法

而不是更改默认编码 - 这不是一个好主意(请参阅mesilliac的答案) - 我只是sys.stdoutStreamWriter这样的包装:

sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)

请参阅此要点,了解处理它的小型实用程序功能。

EN

回答 2

Stack Overflow用户

发布于 2018-09-17 14:24:57

如何在Python <3中将UTF-8编码的文本打印到控制台?

print u"some unicode text \N{EURO SIGN}"
print b"some utf-8 encoded bytestring \xe2\x82\xac".decode('utf-8')

即,如果您有Unicode字符串,则直接打印它。如果你有一个bytestring,那么先将它转换为Unicode。

您的语言环境设置(LANGLC_CTYPE)表示utf-8语言环境,因此(理论上)您可以直接打印utf-8字节字符串,它应该在您的终端中正确显示(如果终端设置与语言环境设置一致,它们应该是但你应该避免它:不要在你的脚本中硬编码环境的字符编码 ; 直接打印Unicode

你的问题有很多错误的假设。

您无需PYTHONIOENCODING使用区域设置进行设置,即可将Unicode打印到终端。utf-8语言环境支持所有Unicode字符,即它按原样工作。

您不需要解决方法sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)。如果某些代码(您无法控制)确实需要打印字节和/或在将Unicode打印到Windows控制台时可能会中断(错误的代码页,无法打印不可解码的字符),则可能会中断 。正确的区域设置和/或PYTHONIOENCODINGenvvar就足够了。此外,如果您需要更换sys.stdout然后使用io.TextIOWrapper()而不是codecswin-unicode-console一样模块

sys.getdefaultencoding()与您的区域设置无关 PYTHONIOENCODING。您认为设置PYTHONIOENCODING 应该更改的假设sys.getdefaultencoding()是不正确的。你应该检查一下sys.stdout.encoding

sys.getdefaultencoding()打印到控制台时不使用。如果将stdout重定向到文件/管道,它可以用作Python 2的后备,除非PYTHOHIOENCODING设置为:

$ python2 -c'import sys; print(sys.stdout.encoding)'
UTF-8
$ python2 -c'import sys; print(sys.stdout.encoding)' | cat
None
$ PYTHONIOENCODING=utf8 python2 -c'import sys; print(sys.stdout.encoding)' | cat
utf8

不要打电话sys.setdefaultencoding("UTF-8"); 它可能会静默地破坏您的数据和/或破坏不期望它的第三方模块。记住sys.getdefaultencoding()用于在Python 2中隐式转换bytestrings(str),例如, 。另见 @ mesilliac答案中的引用unicode"a" + u"b"

票数 0
EN

Stack Overflow用户

发布于 2018-09-17 15:16:52

似乎不建议完成此操作。

Fedora建议使用系统区域设置作为默认设置,但显然这会打破其他事情。

以下是邮件列表讨论的引用:

Python中唯一支持的默认编码是:

 Python 2.x:ASCII
 Python 3.x:UTF-8

如果你改变了这些,你就是自己而且奇怪的事情就会发生
开始发生。默认编码不仅会影响
Python与外界之间的翻译,也是
8位字符串和Unicode之间的所有内部转换。

黑客喜欢pango模块中发生的事情(设置
通过重新加载站点模块将默认编码设置为“utf-8”
为了获得sys.setdefaultencoding()API,我们只是
彻底的错误,将导致自Unicode以来的严重问题
对象缓存其默认编码表示。

请不要启用基于区域设置的默认编码。

如果你想要实现的只是获得编码
stdout和stdin正确设置管道,你应该
而是更改那些(仅)的.encoding属性。

-  
Marc-Andre Lemburg
eGenix.com
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档