python - 在 Python 中管道标准输出时设置正确的编码

标签 python encoding terminal stdout python-2.x

当对 Python 程序的输出进行管道传输时,Python 解释器会混淆编码并将其设置为 None。这意味着这样的程序:

# -*- coding: utf-8 -*-
print u"åäö"

正常运行时会正常工作,但会失败:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 0: ordinal not in range(128)

在管道序列中使用时。

配管时最好的方法是什么?我可以告诉它使用外壳/文件系统/正在使用的任何编码吗?

到目前为止,我看到的建议是直接修改您的 site.py,或使用此 hack 硬编码默认编码:

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
print u"åäö"

有没有更好的方法让管道工作?

最佳答案

您的代码在脚本中运行时有效,因为 Python 将输出编码为您的终端应用程序使用的任何编码。如果你是管道,你必须自己编码。

经验法则是:始终在内部使用 Unicode。解码您收到的内容,并对您发送的内容进行编码。

# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')

另一个教学示例是一个 Python 程序,用于在 ISO-8859-1 和 UTF-8 之间进行转换,将其间的所有内容都设为大写。

import sys
for line in sys.stdin:
    # Decode what you receive:
    line = line.decode('iso8859-1')

    # Work with Unicode internally:
    line = line.upper()

    # Encode what you send:
    line = line.encode('utf-8')
    sys.stdout.write(line)

设置系统默认编码是个坏主意,因为您使用的某些模块和库可能依赖于它是 ASCII 的事实。不要这样做。

关于python - 在 Python 中管道标准输出时设置正确的编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/492483/

相关文章:

python - 在带有 Tensorflow 张量的 Keras 模型中使用 InputLayer(或 Input)有什么好处?

Javascript: encodeURI()/encodeURIComponent() 字符集

linux - 捕获过去的终端消息/ session 文本

ruby - 从 ruby​​ 代码打开终端?

python - 一旦任何进程遇到错误,如何在 python 中终止异步星图多处理池

Python - 读取 .b4u 文件 - 找到错误序列项 0 : expected str instance, 字节

python - 使用 PyGobject 创建自定义 GtkCellRenderer

windows - "Windows uses UTF-16 as its internal encoding",这到底是什么意思?

c# - 使用 OGG 视频 block 的实时视频流

java - 无法写入 pty - linux