管道Python程序的输出时,Python解释器会对编码感到困惑,并将其设置为None.这意味着这样的程序:
# -*- coding: utf-8 -*- print u"åäö"
正常运行时会正常工作,但失败时:
UnicodeEncodeError:'ascii'编解码器无法对位置0中的字符u'\ xa0'进行编码:序数不在范围内(128)
当在管道序列中使用时.
在配管时使这项工作的最佳方法是什么?我可以告诉它使用shell/filesystem /无论使用什么编码吗?
到目前为止我看到的建议是直接修改你的site.py,或者使用这个hack对defaultencoding进行硬编码:
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') print u"åäö"
是否有更好的方法使管道工作?
首先,关于这个解决方案:
# -*- 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)
您的代码在脚本中运行时有效,因为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的事实.不要这样做.
您可能想尝试将环境变量"PYTHONIOENCODING"更改为"utf_8".我已经在这个问题上写了一篇关于我的考验的页面.
Tl;博客博士:
import sys, locale, os
print(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
ö ? ?
export PYTHONIOENCODING=utf-8
做的工作,但不能在python本身设置...
我们可以做的是验证是否设置并告诉用户在调用脚本之前设置它:
if __name__ == '__main__': if (sys.stdout.encoding is None): print >> sys.stderr, "please set python env PYTHONIOENCODING=UTF-8, example: export PYTHONIOENCODING=UTF-8, when write to stdout." exit(1)
更新回复评论:管道到stdout时问题就存在了.我在Fedora 25 Python 2.7.13中测试过
python --version Python 2.7.13
猫b.py
#!/usr/bin/env python #-*- coding: utf-8 -*- import sys print sys.stdout.encoding
正在运行./b.py
UTF-8
正在运行./b.py | 减
None
上周我有类似的问题.在我的IDE(PyCharm)中很容易修复.
这是我的修复:
从PyCharm菜单栏开始:File - > Settings ... - > Editor - > File Encodings,然后设置:"IDE Encoding","Project Encoding"和"属性文件的默认编码"ALL到UTF-8,她现在正在工作喜欢魅力.
希望这可以帮助!