2

我正在使用免费的网络主机,但选择不使用任何 Python 框架,并且一直试图将保存在源文件中的中文字符(使用 emacs 保存以 utf-8 编码的文件)打印到生成的 HTML 页面。我认为 Unicode 在 Python 3.1 中“正常工作”,所以我很困惑。我发现了三个不起作用的解决方案。我可能只是遗漏了一两个细节。

主机是 Alwaysdata,它使用起来很简单,所以我对它们如何组合部件的细节知之甚少。我所做的只是将 Python 文件上传或编辑(使用 ssh)到 www 文件夹,更改权限,将浏览器指向正确的 URL,然后它就可以工作了。

我的第一次尝试,它适用于本地 IDLE(以及服务器的 Python 命令行交互式 shell,这让我更加困惑,为什么它在传递给浏览器时不起作用)

#!/usr/bin/python3.1

mystr = "世界好"
print("Content-Type: text/html\n\n")
print("""<!DOCTYPE html>
<html><head><meta charset="utf-8"></head>
<body>""")

print(mystr)

错误是:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: 
ordinal not in range(128)

然后我尝试了

print(mystr.encode("utf-8"))

导致没有错误,但以下不希望的输出到浏览器:

b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xb8\x96\xe7\x95\x8c'

第三,添加了以下行但出现错误:

import sys
sys.setdefaultencoding("utf-8")

AttributeError: 'module' object has no attribute 'setdefaultencoding'

最后,用 f.write 替换 print:

import codecs
f = codecs.open(sys.stdout, "w", "utf-8")

mystr = "你好世界"
...
f.write(mystr)

错误:

TypeError: invalid file: <_io.TextIOWrapper name='<stdout>' 
encoding='ANSI_X3.4-1968'>

如何使输出正常工作?我需要使用框架进行快速修复吗?

4

1 回答 1

2

听起来您正在使用 CGI,这是一个愚蠢的 API,因为它使用标准输出,用于输出给人类,输出到您的浏览器。这是你的问题的基本来源。

您需要将其编码为 UTF-8,然后写入 sys.stdout.buffer 而不是 sys.stdout。

在那之后,给自己一个网络框架。真的,你会快乐很多。

于 2012-04-04T16:54:03.710 回答