2012-04-04 33 views
2

我正在使用免费的Web主机,但选择不使用任何Python框架,并且试图打印保存在源文件中的汉字(使用emacs保存utf-8编码的文件)到生成的HTML页面。我认为Unicode在Python 3.1中“起作用”,所以我很困惑。我发现三种解决方案无效。我可能只是缺少一两个细节。Python 3.1服务器端无法向客户端输出Unicode字符串

主机是Alwaysdata,它的使用非常简单,所以我对他们如何将各部分放在一起的细节知之甚少。我所做的只是上传或编辑(使用ssh)Python文件到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")) 

资源ulting中没有错误,但下面不期望的输出到浏览器:添加

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更换打印:

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'> 

如何获得输出?我需要使用框架来快速修复吗?

+0

你是如何运行代码的?请注意,任何试图避免的解决方案都注定要失败 - 正如[Pragmatic Unicode](http://nedbatchelder.com/text/unipain.html)(无疑在其他地方)中指出的那样,网络连接总是*字节,而不是'unicode'。 – delnan 2012-04-04 15:13:05

+0

我不认为我理解它是如何运行的所有细节。该帐户在Alwaysdata中,我所做的只是将Python文件FTP到www文件夹(或使用ssh编辑),更改权限,然后将浏览器指向该文件。 – 2012-04-04 15:21:40

+0

假设你正在使用CGI,这是一个重复:http://stackoverflow.com/questions/5515007/python-3-cgi-how-to-output-raw-bytes – 2012-04-04 16:54:50

回答

2

听起来好像你正在使用CGI,这是一个愚蠢的API,因为它使用stdout,输出到人类,输出到你的浏览器。这是你问题的根本来源。

您需要使用UTF-8对其进行编码,然后写入sys.stdout.buffer而不是sys.stdout。

然后,让自己一个webframework。真的,你会更开心。

+0

谢谢你的评论和答案。评论中的链接对我的问题有了答案。 – 2012-04-04 17:04:21