Уведомления

Группа в Telegram: @pythonsu

#1 Май 27, 2009 15:37:41

kvazar
От:
Зарегистрирован: 2009-01-05
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

CGI и кодировки

Здравствуйте, Всем.
У меня возникла такая проблема.
Я питон ещё только изучаю и вот решил для себя написать небольшую ЦМСку для сайта, всё вроде бы хорошо, но вот впал в ступор с кодировками.
Использую python 3.0.
Отправляю данные с русскими буквами через форму.
На входе примерно такой код.

import cgi
mPost = cgi.FieldStorage()
if 'code' in mPost:
print(mPost['code'].value)
При отправке генерируется исключение “UnicodeEncodeError”.
Реально уже столько времени потратил, но никак не могу это победить.
Стоит Винда-Денвер.
Локаль cp1251.
Как я понимаю при запуске print() он пытается закодировать символы юникода в cp1251 и фик получается.
Я делаю вывод, что значит на входе русские буквы неправильно декодировались в юникод…
Я так думаю, что ошибка в том, что он пытается при чтении входящего потока декодировать его, как utf-8 исходя из значения sys.getdefaultencoding()?
Пробовал править, чтобы дефолтная локаль была utf-8. В итоге print() стал выдавать текст в кодировке utf-8 и при отправке уже ошибок не было. Правда браузеры в упор не понимали в какой кодировке страницы.
Кто-нибудь может прояснить картину? Как все честные люди решают этот вопрос?



Отредактировано (Май 27, 2009 15:41:53)

Офлайн

#2 Май 28, 2009 12:13:11

kvazar
От:
Зарегистрирован: 2009-01-05
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

CGI и кодировки

Смог решить вопрос самостоятельно -)
Тема закрыта.



Офлайн

#3 Май 28, 2009 12:17:21

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

CGI и кодировки

kvazar
Смог решить вопрос самостоятельно -)
Так напишите как!:-)



Офлайн

#4 Май 28, 2009 16:03:43

kvazar
От:
Зарегистрирован: 2009-01-05
Сообщения: 25
Репутация: +  0  -
Профиль   Отправить e-mail  

CGI и кодировки

Да всё оказалось достаточно просто -)
Всё дело в моей неграмотности.
Я для себя это решил путём написания небольшой функции.
Написал так, чтобы в какой кодировке print() выводит, то в такую же кодировку и декодируется входящий поток и потом кодируется в юникод.
Странно, что разработчики по умолчанию так не сделали, указав utf-8 по дефолту…
#
def fPost(encodeName=''):
“”“
Функция читает входящий поток, переданный методом POST.
Возвращает словарь - ключ(название переменной) = значение.
”“”
if encodeName == '':
import locale
encodeName = locale.getpreferredencoding()
import urllib.parse as parse
import sys
dVars = {}
pStream = sys.stdin.read()
if len(pStream) < 1: return dVars
# Декодируем строку содержащую последовательности вида %xx
mText = parse.unquote(pStream.replace(“+”,“ ”),encoding=encodeName)
for nameVal in mText.split(“&”):
name,val = nameVal.split(“=”,1)
dVars = val
return dVars



Отредактировано (Май 28, 2009 16:05:56)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version