如何以与python2和python3一起使用的方式将utf8写入标准输出

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.

我找到了最好的方法还是有更好的选择?我可以使打印功能起作用吗?

Add*_*son 1

如果您不需要打印到sys.stdout.buffer,那么以下内容应该可以正常打印到sys.stdout. I tried it in both Python 2.7 and 3.4, and it seemed to work fine:

\n\n
# -*- coding=utf-8 -*-\nprint("bar" + u"\xe2\x86\x92")\n
Run Code Online (Sandbox Code Playgroud)\n

  • @rds我没有看到任何关于输出到文件的提及。我确实看到到处都提到了有关打印到标准输出的内容,包括帖子的标题。 (2认同)