對於CGI,使用print()
要求正確的編解碼器已被設置爲輸出。 print()
寫入sys.stdout
和sys.stdout
已打開具有特定編碼,以及如何確定取決於平臺和可以根據腳本的運行方式而有所不同。將腳本作爲CGI腳本運行意味着您幾乎不知道將使用哪種編碼。
就你而言,Web服務器已經將文本輸出的區域設置爲除UTF-8以外的固定編碼。 Python使用該區域設置以該編碼產生輸出,並且沒有<meta>
標題,瀏覽器正確地猜測該編碼(或者服務器已經在Content-Type標題中傳達它),但是使用<meta>
標題告訴它使用一種不同的編碼,一種對生成的數據不正確。
在明確編碼爲UTF-8之後,您可以直接寫入sys.stdout.buffer
。做一個輔助函數來簡化這一過程:
import sys
def enc_print(string='', encoding='utf8'):
sys.stdout.buffer.write(string.encode(encoding) + b'\n')
enc_print("Content-type:text/html")
enc_print()
enc_print("""
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
şöğıçü
</body>
</html>
""")
另一種方法是使用你所需要的編解碼器的一個新io.TextIOWrapper()
object更換sys.stdout
:
import sys
import io
def set_output_encoding(codec, errors='strict'):
sys.stdout = io.TextIOWrapper(
sys.stdout.detach(), errors=errors,
line_buffering=sys.stdout.line_buffering)
set_output_encoding('utf8')
print("Content-type:text/html")
print()
print("""
<!doctype html>
<html>
<head></head>
<body>
şöğıçü
</body>
</html>
""")
您是否指定了源編碼?編輯器保存的文件是什麼編碼? Python發送你輸入的字符串*真正*所以如果你用Latin-1編碼保存了這個文件,這就是發送的內容。 – 2013-02-13 18:07:30
文件編碼:utf-8。通常,它的工作原理。我以前的項目工作。我使用Python3.3。它的默認編碼是utf8。順便說一句,我不會說英語。有時我不明白 – user1898723 2013-02-13 18:23:52
啊哈,這是重要的信息!在這種情況下,你需要明確編碼。 – 2013-02-13 18:25:47