Найти - Пользователи
Полная версия: CGI и кодировки
Начало » Web » CGI и кодировки
1
kvazar
Здравствуйте, Всем.
У меня возникла такая проблема.
Я питон ещё только изучаю и вот решил для себя написать небольшую ЦМСку для сайта, всё вроде бы хорошо, но вот впал в ступор с кодировками.
Использую 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 и при отправке уже ошибок не было. Правда браузеры в упор не понимали в какой кодировке страницы.
Кто-нибудь может прояснить картину? Как все честные люди решают этот вопрос?
kvazar
Смог решить вопрос самостоятельно -)
Тема закрыта.
Александр Кошелев
kvazar
Смог решить вопрос самостоятельно -)
Так напишите как!:-)
kvazar
Да всё оказалось достаточно просто -)
Всё дело в моей неграмотности.
Я для себя это решил путём написания небольшой функции.
Написал так, чтобы в какой кодировке 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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB