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

发布于 2021-02-02 23:21:14

当传递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"åäö"

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

关注者
0
被浏览
111
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    你的代码在脚本中运行时有效,因为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的事实。不要这样



  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    首先,关于此解决方案:

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

    每次都使用给定的编码显式打印是不切实际的。那将是重复的并且容易出错。

    更好的解决方案是sys.stdout在程序开始时进行更改,以使用选定的编码进行编码。这是我在Python上找到的一种解决方案:如何选择sys.stdout.encoding?,特别是“ toka”的评论:

    import sys
    import codecs
    sys.stdout = codecs.getwriter('utf8')(sys.stdout)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看