Unicode Python3 CGI:如何输出原始字节

Unicode Python3 CGI:如何输出原始字节,unicode,encoding,utf-8,python-3.x,webserver,Unicode,Encoding,Utf 8,Python 3.x,Webserver,我决定使用Python3制作我的网站,但我遇到了Unicode输出的问题 看起来普通的print(html)#html是一个str应该可以工作,但它不是。我得到UnicodeEncodeError:“ascii”编解码器无法编码字符[…]:序号不在范围(128)。这一定是因为Web服务器不支持unicode输出 下一步我尝试的是打印(html.encode('utf-8')),但我得到了类似字节字符串的repr输出:它被放置在b'…'中,所有转义字符都是原始形式(例如\n和\xd0\x9c) 请

我决定使用Python3制作我的网站,但我遇到了Unicode输出的问题

看起来普通的
print(html)#html是一个
str
应该可以工作,但它不是。我得到
UnicodeEncodeError:“ascii”编解码器无法编码字符[…]:序号不在范围(128)
。这一定是因为Web服务器不支持unicode输出

下一步我尝试的是打印(html.encode('utf-8'))
,但我得到了类似字节字符串的repr输出:它被放置在
b'…'
中,所有转义字符都是原始形式(例如
\n
\xd0\x9c


请告诉我在Python 3.1中将Unicode(str)字符串作为原始UTF-8编码字节字符串输出的正确方法。这里的问题是您的标准输出未连接到实际终端,默认情况下将使用ASCII编码。因此,您需要写入sys.stdout.buffer,它是sys.stdout的“原始”二进制输出。这可以通过多种方式实现,最常见的方式似乎是:

import codecs, sys
writer = codecs.getwriter('utf8')(sys.stdout.buffer)
以及使用编写器。在CGI脚本中,您可以用编写器替换sys.stdout,以便:

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

可能真的可以正常打印。试试看

这确实起到了作用,但我并不需要一直使用
print
函数,因此我不必替换sys.stdout(我也不想,因为这看起来很粗糙)。如何“刷新”
编写器
?如果我使用
writer.reset()
writer.flush()
…解决:
print(html,file=writer)
请注意,Python 3.1上的cgi和wsgi包中存在问题。直到3.2,Python3才真正可用于web应用程序。