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

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

当Python程序输出管道时,Python解释器会对编码感到困惑,并将其设置为None。这意味着这样的程序:

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

在正常运行时工作正常,但在以下情况下失败:

UnicodeEncodeError:‘ASCII’编解码器不能编码0位置的字符u‘\xA0:序号不在范围内(128)

在管道序列中使用时。

什么是最好的办法,使这个工作时,管道?我可以告诉它使用任何编码shell/文件系统/任何正在使用的东西吗?

到目前为止,我看到的建议是直接修改站点.py,或者使用这个黑客对默认编码进行硬编码:

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

有更好的方法使管道工作吗?


宝慕林4294392
浏览 903回答 3
3回答

繁花不似锦

在脚本中运行时,代码可以工作,因为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这一事实。别这么做。

阿晨1998

首先,关于这一解决办法:# -*- coding: utf-8 -*-print u"åäö".encode('utf-8')每次使用给定的编码显式打印是不实际的。这将是重复的和容易出错的。更好的解决办法是改变sys.stdout在程序开始时,使用选定的编码进行编码。这是我找到的一个解决方案Python:sys.stdout.code是如何选择的?,特别是“Toka”的评论:import sysimport codecs sys.stdout = codecs.getwriter('utf8')(sys.stdout)

有只小跳蛙

您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。我写了一个我对这个问题的煎熬.博士的博客文章:import sys, locale, osprint(sys.stdout.encoding)print(sys.stdout.isatty())print(locale.getpreferredencoding()) print(sys.getfilesystemencoding())print(os.environ["PYTHONIOENCODING"])print(chr(246), chr(9786), chr(9787))给你utf_8 False ANSI_X3.4-1968 ascii utf_8 ö ☺ ☻
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python