WSGI кодировка контента - PullRequest
       22

WSGI кодировка контента

0 голосов
/ 09 августа 2010

Если я выполняю следующую программу на Python 3.1, я вижу только � вместо правильных символов в моем браузере.Сам файл имеет кодировку UTF-8, и такая же кодировка отправляется с ответом.

from wsgiref.simple_server import make_server

page = "<html><body>äöü€ßÄÖÜ</body></html>"

def application(environ, start_response):
    start_response("200 Ok", [("Content-Type", "text/html; charset=UTF-8")])
    return page

httpd = make_server('', 8000, application)
print("Serving on port 8000...")
httpd.serve_forever()

"UTF-8" правильно задан в ответе:

HTTP/1.0 200 Ok
Date: Mon, 09 Aug 2010 16:35:02 GMT
Server: WSGIServer/0.1 Python/3.1.1+
Content-Type: text/html; charset=UTF-8

Что такоездесь не так?

Ответы [ 2 ]

8 голосов
/ 09 августа 2010

WSGI на Python 3 еще не существует. Web-SIG до сих пор не пришел к какому-либо выводу о том, как обрабатывать строки (байты / юникод) в Python 3.x.

wsgiref - это в основном автоматизированное преобразование 2to3; у него все еще есть проблемы, даже если не учитывать тот факт, что WSGI на 3.x будет означать. Не полагайтесь на это как на ссылку на то, как приложения WSGI будут работать в Python 3.

То, что ситуация все еще , как то, что это входит в цикл выпуска 3.2, смущает и удручает.

return page

Что ж, в то время как WSGI для 3.x все еще остается неизвестным фактором, наиболее единодушным является то, что тело ответа приложения WSGI обычно должно быть байтами, а не юникодом, поскольку HTTP является байтовым протоколом. Будут ли приняты строки Unicode - и если да, то в какую кодировку они будут преобразованы - еще неизвестно, поэтому избегайте проблемы и возвращайте байты:

return [page.encode('utf-8')]

([] необходимы, потому что приложения WSGI должны возвращать итерацию, которая выводится и сбрасывает элемент за раз. Если вы передаете строку самостоятельно, она используется как итерация и возвращает символ за раз, что ужасно для производительности.)

0 голосов
/ 09 августа 2010

Эти символы не UTF-8;они latin-1.Если вы помещаете эти литералы в свой исходный код Python (что не следует делать), вам нужно объявить кодировку файла, поместив следующую строку вверху:

#-*- coding: latin-1 -*-

и указав вlatin-1:

start_response("200 Ok", [("Content-Type", "text/html; charset=latin-1")])

Предполагая, что вы собираетесь делать все в UTF-8, вам нужно найти кодовые точки для этих символов.Затем вы можете сделать

page = u"\x--\x--...\x--"

и использовать его как Unicode.

Обратите внимание, что вы можете проверить это, изменив кодировку вашего браузера;если вы вручную измените его на latin-1, символы будут отображаться нормально.

...