如何使用Python将UTF-8编码的文本打印到控制台<;3.
我正在运行一个最近的Linux系统,其中我的所有区域设置都是UTF-8:如何使用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:-( 我认为最好的(干
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)和AnacondaPython
(或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