Joa*_*org 327 python terminal encoding stdout python-2.x
管道Python程序的输出时,Python解释器会对编码感到困惑,并将其设置为None.这意味着这样的程序:
# -*- coding: utf-8 -*-
print u"åäö"
Run Code Online (Sandbox Code Playgroud)
正常运行时会正常工作,但失败时:
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"åäö"
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法使管道工作?
Cra*_*een 167
首先,关于这个解决方案:
# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
每次使用给定的编码明确打印是不切实际的.这将是重复且容易出错的.
更好的解决方案是sys.stdout在程序开始时更改,使用选定的编码进行编码.这是我在Python上找到的一个解决方案:如何选择sys.stdout.encoding?,特别是"toka"的评论:
import sys
import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
Run Code Online (Sandbox Code Playgroud)
nos*_*klo 157
您的代码在脚本中运行时有效,因为Python会将输出编码为终端应用程序正在使用的任何编码.如果你是管道,你必须自己编码.
经验法则是:始终在内部使用Unicode.解码您收到的内容,并对您发送的内容进行编码.
# -*- coding: utf-8 -*-
print u"åäö".encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
另一个教学示例是一个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)
Run Code Online (Sandbox Code Playgroud)
设置系统默认编码是一个坏主意,因为您使用的某些模块和库可以依赖于它是ASCII的事实.不要这样做.
dav*_*agp 125
您可能想尝试将环境变量"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))
Run Code Online (Sandbox Code Playgroud)
给你
utf_8
False
ANSI_X3.4-1968
ascii
utf_8
ö ? ?
Run Code Online (Sandbox Code Playgroud)
Sér*_*gio 61
export PYTHONIOENCODING=utf-8
Run Code Online (Sandbox Code Playgroud)
做的工作,但不能在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)
Run Code Online (Sandbox Code Playgroud)
更新回复评论:管道到stdout时问题就存在了.我在Fedora 25 Python 2.7.13中测试过
python --version
Python 2.7.13
Run Code Online (Sandbox Code Playgroud)
猫b.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
print sys.stdout.encoding
Run Code Online (Sandbox Code Playgroud)
正在运行./b.py
UTF-8
Run Code Online (Sandbox Code Playgroud)
正在运行./b.py | 减
None
Run Code Online (Sandbox Code Playgroud)
我很惊讶这个答案还没有发布在这里
从 Python 3.7 开始,您可以使用以下命令更改标准流的编码
reconfigure():Run Code Online (Sandbox Code Playgroud)sys.stdout.reconfigure(encoding='utf-8')您还可以通过添加参数来修改处理编码错误的方式
errors。
从Python 3.7开始,我们可以通过使用命令行选项-X utf8来使用Python UTF-8模式:
\n python -X utf8 testzh.py\nRun Code Online (Sandbox Code Playgroud)\n脚本 testzh.py 包含
\nprint("Content-type: text/html; charset=UTF-8\\n") \nprint("\xe5\x9c\xb0\xe7\x90\x83\xe4\xbd\xa0\xe5\xa5\xbd!")\n\nRun Code Online (Sandbox Code Playgroud)\n要将 Windows 10 Internet 服务 IIS 设置为 CGI 脚本处理程序,
\n我们将可执行文件设置为:
\n"C:\\Program Files\\Python39\\python.exe" -X utf8 %s\nRun Code Online (Sandbox Code Playgroud)\n\n这适用于 Microsoft.Edge 浏览器上的中文表意文字,如下截图所示: 否则,会发生错误。
\n\n请参阅https://docs.python.org/3/library/os.html#utf8-mode
\n