jos*_*sch 8 python encoding stdout python-3.x
我想写一个非ascii字符,让我们说?标准输出.棘手的部分似乎是我想要连接到该字符串的一些数据是从json读取的.考虑以下简单的json文档:
{"foo":"bar"}
Run Code Online (Sandbox Code Playgroud)
我包括这个因为如果我只是想打印?那么它似乎足以简单地写:
print("?")
Run Code Online (Sandbox Code Playgroud)
它将在python2和python3中做正确的事情.
所以我想打印foo与非ascii字符一起的值?.我发现这样做的唯一方法就是它在python2和python3中都有效:
getattr(sys.stdout, 'buffer', sys.stdout).write(data["foo"].encode("utf8")+u"?".encode("utf8"))
Run Code Online (Sandbox Code Playgroud)
要么
getattr(sys.stdout, 'buffer', sys.stdout).write((data["foo"]+u"?").encode("utf8"))
Run Code Online (Sandbox Code Playgroud)
重要的是不要错过u前面的?因为否则UnicodeDecodeError将被python2抛出.
使用这样的print功能:
print((data["foo"]+u"?").encode("utf8"), file=(getattr(sys.stdout, 'buffer', sys.stdout)))
Run Code Online (Sandbox Code Playgroud)
似乎没有用,因为python3会抱怨TypeError: 'str' does not support the buffer interface.
我找到了最好的方法还是有更好的选择?我可以使打印功能起作用吗?
如果您不需要打印到sys.stdout.buffer,那么以下内容应该可以正常打印到sys.stdout. I tried it in both Python 2.7 and 3.4, and it seemed to work fine:
# -*- coding=utf-8 -*-\nprint("bar" + u"\xe2\x86\x92")\nRun Code Online (Sandbox Code Playgroud)\n