2011-04-01 39 views
4

我決定使用Python 3來製作我的網站,但是我遇到了Unicode輸出的問題。Python 3 CGI:如何輸出原始字節

看起來像純print(html) #html is astr應該工作,但它不是。我得到UnicodeEncodeError: 'ascii' codec can't encode characters[...]: ordinal not in range(128)。這一定是因爲網絡服務器不支持unicode輸出。

我想接下來的事情是print(html.encode('utf-8')),但我得到了類似再版的字節串輸出:它被放在裏面b'...'和所有的轉義字符以原始形式(如\n\xd0\x9c

請告訴我正確的方式來輸出一個Unicode(STR)字符串作爲原料UTF-8編碼字節在Python串3.1

+0

請注意,Python 3.1上的cgi和wsgi包存在問題。直到3.2之前,Python 3才真正用於Web應用程序。 – bobince 2011-04-01 20:55:27

回答

7

這裏的問題是,你stdout不是連接到一個實際的TERMIN並且默認使用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) 

實際工作方式可能讓您可以正常打印。試試看!

+0

這樣做的竅門,但我並不需要始終使用'print'函數,所以我不必更換sys.stdout(而且我不想,因爲這看起來很詭異)。我應該如何「沖洗」「作家」?如果我使用'writer.reset()'或'writer.flush()',輸出中似乎沒有任何東西出現...... – 2011-04-01 16:41:12

+1

解決:'print(html,file = writer)' – 2011-04-01 17:16:08