【问题标题】:Python 3 CGI: how to output raw bytesPython 3 CGI:如何输出原始字节
【发布时间】:2011-07-27 18:22:24
【问题描述】:

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

看起来普通的print(html) #html is astr 应该可以工作,但事实并非如此。我得到UnicodeEncodeError: 'ascii' codec can't encode characters[...]: ordinal not in range(128)。这一定是因为网络服务器不支持 unicode 输出。

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

请告诉我在 Python 3.1 中将 Unicode (str) 字符串输出为原始 UTF-8 编码 bytes 字符串的正确方法

【问题讨论】:

  • 请注意,Python 3.1 上的 cgi 和 wsgi 包存在问题。 Python 3 直到 3.2 才真正可用于 Web 应用程序。

标签: unicode encoding utf-8 python-3.x webserver


【解决方案1】:

这里的问题是您的标准输出没有连接到实际的终端,默认情况下将使用 ASCII 编码。因此,您需要写入 sys.stdout.buffer,它是 sys.stdout 的“原始”二进制输出。这可以通过多种方式完成,最常见的一种似乎是:

import codecs, sys
writer = codecs.getwriter('utf8')(sys.stdout.buffer)

还有使用作家。在 CGI 脚本中,您可以将 sys.stdout 替换为 writer,这样:

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

可能确实有效,因此您可以正常打印。试试看!

【讨论】:

  • 这成功了,但我真的不需要一直使用 print 函数,所以我不必替换 sys.stdout (我不想,因为这看起来很hackish)。我应该如何“刷新”writer?如果我使用writer.reset()writer.flush(),输出中似乎没有出现任何内容...
  • 已解决:print(html,file=writer)
猜你喜欢
  • 2021-01-23
  • 2015-11-02
  • 2020-06-24
  • 2018-11-03
  • 2018-09-15
  • 2019-05-02
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多