在Python中管道输出标准输出时设置正确的编码
当传递Python程序的输出的管道时,Python解释器对编码感到困惑,并将其设置为None。这意味着这样的程序:
# -*- coding: utf-8 -*-print u"åäö"
正常运行时可以正常工作,但失败:
UnicodeEncodeError:'ascii'
编解码器无法在位置0
编码字符u'\ xa0'
:序数不在范围内(128)
以管道顺序使用时。
使管道工作的最佳方法是什么?我能告诉它使用外壳程序/文件系统/正在使用的任何编码吗?
到目前为止,我所看到的建议是直接修改你的site.py
,或使用此hack硬编码defaultencoding
:
# -*- 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 sysfor 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中管道输出标准输出时设置正确的编码 的全部内容, 来源链接: utcz.com/qa/409107.html