当管道 Python 程序的输出时,Python 解释器对编码感到困惑,并将其设置为 None。这意味着这样的程序:
# -*- coding: utf-8 -*- print u"åäö"
正常运行时会正常工作,但会失败:
UnicodeEncodeError:“ascii”编解码器无法在位置 0 编码字符 u’\xa0’:序数不在范围内(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 的事实。不要这样做。