为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

宝慕林4294392 2019-06-18 10:44:29
在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"åäö"有更好的方法使管道工作吗?
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-06-18
?
阿晨1998

TA贡献2037条经验 获得超6个赞

首先,关于这一解决办法:

# -*- 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)


查看完整回答
反对 回复 2019-06-18
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

您可能想尝试将环境变量“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
ö ☺ ☻


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 902 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信