2012-04-04 38 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