如何使用Python将UTF-8编码的文本打印到控制台<;3.

如何使用Python将UTF-8编码的文本打印到控制台<;3.,python,shell,encoding,utf-8,ascii,Python,Shell,Encoding,Utf 8,Ascii,我正在运行一个最近的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:-( 我认为最好的(干

我正在运行一个最近的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:-(


我认为最好的(干净的)方法是设置
pythonionencoding
环境变量。但Python似乎忽略了它。至少在我的系统上,我一直将
ascii
作为默认编码,即使在设置了envvar之后也是如此

如果我在脚本开始时执行以下操作,它仍然有效:

>>> import sys
>>> reload(sys)  # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
请参阅,以获取处理它的小实用程序函数。

我就是这样做的:

#!/usr/bin/python2.7 -S

import sys
sys.setdefaultencoding("utf-8")
import site

请注意行中的
-S
。这告诉Python不要自动导入
站点
模块。
站点
模块是设置默认编码的模块,它会删除该方法,因此无法再次设置。但会尊重已设置的内容。

似乎不建议这样做

Fedora建议, 但很明显,这破坏了其他东西

以下是一段引用自:

Python中唯一支持的默认编码是: Python2.x:ASCII Python3.x:UTF-8 如果你改变这些,你就只能靠自己了,奇怪的事情就会发生 开始。默认编码不仅影响 Python与外部世界之间的转换,而且 8位字符串和Unicode之间的所有内部转换。 黑客喜欢pango模块中发生的事情(设置 通过在中重新加载站点模块,默认编码为“utf-8” 要获取sys.setdefaultencoding()API,只需 完全错误,将导致Unicode之后的严重问题 对象缓存其默认编码表示形式。 请不要启用基于区域设置的默认编码。 如果您只想获得 标准输出和标准输入正确设置管道,您应该 改为更改这些的.encoding属性(仅限)。 -- 马克·安德烈·伦伯格 eGenix.com 如何在Python<3的控制台上打印UTF-8编码的文本

i、 例如,如果你有一个Unicode字符串,那么直接打印它 然后首先将bytestring转换为Unicode

您的区域设置(
LANG
LC\u CTYPE
)指示utf-8区域设置和 因此(理论上)您可以直接通过TestRing打印utf-8,然后 应在终端中正确显示(如果为终端设置 与区域设置一致,它们应该是)但是 应该避免:不要硬编码您的 脚本中的环境;直接打印Unicode

你的问题中有许多错误的假设


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

您不需要解决方法
sys.stdout=
codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
。它可能 如果某些代码(您不控制)需要打印字节,则中断 和/或它可能会在
。正确的区域设置和/或
PYTHONIOENCODING
envvar就足够了。此外,如果需要替换
sys.stdout
,则like也可以

sys.getdefaultencoding()
与您的区域设置和
pythonionecoding
。您假设设置
pythonionecoding
应更改
sys。getdefaultencoding()
不正确。您应该 改为选中系统标准编码

打印到系统时不使用sys.getdefaultencoding() 如果stdout是 重定向到文件/管道,除非设置了
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()用于转换ByTestRing (
str
)到/从Python 2中的
unicode
,例如,
“a”+u“b”
。另请参见,
.

如果程序没有在屏幕上显示适当的字符, i、 例如,无效符号, 使用以下命令行运行程序:

PYTHONIOENCODING=utf8 python3 yourprogram.py
或者,如果您的程序是全局安装的模块,请执行以下操作:

PYTHONIOENCODING=utf8 yourprogram
在某些平台上,如Cygwin(
mintty.exe
terminal)和Anaconda
Python
(或
Python 3
),只需运行
export PYTHONIOENCODING=utf8
,然后 以后运行该程序不起作用, 并且,您需要每次都执行
pythonionecoding=utf8您的程序
,才能正确运行程序

在Linux上,对于
sudo
,您可以尝试传递
-E
参数以将用户变量导出到sudo进程:

export PYTHONIOENCODING=utf8
sudo -E python yourprogram.py
如果您尝试此操作但未成功,则需要输入sudo shell:

sudo /bin/bash
PYTHONIOENCODING=utf8 yourprogram
相关的:


  • 虽然了解OP问题是针对Linux的:当通过搜索引擎在这里结束时,在Windows 10上,以下解决了该问题:

    set PYTHONIOENCODING=utf8
    python myscript.py
    

    也许这会起作用:#!/usr/bin/env python#——编码:utf-8——记住把它放在源文件的最前面。这只会影响python在源代码中解释文本字符串的方式。IO编码仍然是ASCII。
    pythoniocodeding
    不会被忽略;只是,正如它的名字所暗示的,它不是你想要的重新检查。@Brutus:你是如何测试它不起作用的?它似乎对我起作用。
    python-c'import sys;print sys.stdout.encoding'
    给出了
    UTF-8
    ,而
    PYTHONIOENCODING='c'python-c'import sys;print sys.stdout.encoding'
    给出了
    c
    。你能根据mesilliac的回答进一步说明吗给?还是正确的吗?@Arafangion我用的方法
    PYTHONIOENCODING=utf8 python3 yourprogram.py
    
    PYTHONIOENCODING=utf8 yourprogram
    
    export PYTHONIOENCODING=utf8
    sudo -E python yourprogram.py
    
    sudo /bin/bash
    PYTHONIOENCODING=utf8 yourprogram
    
    set PYTHONIOENCODING=utf8
    python myscript.py