Appengine конвертирует символ unicode в пустой символ в urllib.unquote - PullRequest
1 голос
/ 29 октября 2011

Я отправляю закодированные данные поста в appengine project. Но appengine показывает пустой символ в ответе.

Я отправляю данные формы: mdata=I%FD%FD%FE%DE%DE%E7%E7%C7%D6%F6%F6%D6%D6%0A%0A

, и мой код ответа appengine:

request_data = self.request.get('mdata')
mailhtmldata = urllib.unquote_plus(request_data)

И repr (request_data) и repr (mailhtmldata) равны u'I\n\n'. Все символы Unicode, такие как "İşÇöÖü", пусты. Я уверен, что мой отправитель отправляет mdata=I%FD%FD%FE%DE%DE%E7%E7%C7%D6%F6%F6%D6%D6%0A%0A .i проверено. Гдеесть другие символы в appengine?

Спасибо за помощь.

Извините за мой плохой английский

Обновление:

Этофункция моего отправителя

def mailSend():
    values = urllib.urlencode({'mailam' : 'deneme@hotmail.com', 'mfromname' :'Deneme Kisisi', 'mkonu' : 'This is Subject', 'mdata' : 'IıışŞşÖÖççç'})
    headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
    conn = httplib.HTTPConnection("xxxxxx.appspot.com")
    conn.request("POST", "/gondergitsin", values, headers)
    response = conn.getresponse()
    data = response.read()
    print data
    conn.close()

И это код приложения:

class mTransfer(webapp.RequestHandler):
    def post(self):
        mailhtmldata = urllib.unquote_plus(self.request.get('mdata'))
        x2adresx = urllib.unquote(self.request.get('mailam'))
        x2gonderenx = urllib.unquote(self.request.get('mfromname'))
        x2gondid = ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(12))
        anagonderen = "Deneme <info@koorsender.appspotmail.com>"
        mailsubjdata = urllib.unquote(self.request.get('mkonu'))
        message = mail.EmailMessage(sender=anagonderen, subject=mailsubjdata)
        message.to = x2adresx
        message.body = mailhtmldata
        message.html = mailhtmldata
        message.send()
        self.response.out.write("OK")

Я пытался, но все еще не могу найти решение

Обновление 2: Если вы используете кодировки юникода, вы декодируете его в кодировку, а после этого можете кодировать его в utf-8.

Ответы [ 2 ]

0 голосов
/ 30 октября 2011

Попробуйте преобразовать его в "utf-8" перед кодировкой urlenc:

0 голосов
/ 29 октября 2011

То, что вы отправляете, похоже, является результатом кодирования url некоторых символов, выраженных в кодировке cp1254 (Windows Turkish) (или очень похожей кодировке ISO-8859-9). Вы сказали "appengine", какую кодировку вы используете?

Нам нужно немного больше информации о "Все еще символы unicode, такие как" İşÇöÖü "пустые". Пустой, когда вы смотрите на них, как? Вместо

htmldata = urllib.unquote_plus(self.request.get('mdata'))

сделать это:

request_data = self.request.get('mdata')
htmldata = urllib.unquote_plus(request_data)

и отредактируйте свой вопрос, чтобы показать результаты repr(request_data) и repr(htmldata)

Обновление Вы говорите, что self.request.get('mdata') возвращает u'I\n\n' ... символы не-ASCII в ваших данных не возвращаются пустыми; они удалены .

Чей-то код удаляет не-ASCII символы. Что-то вроде your_input.decode(some_encoding, 'ignore') с some_encoding, установленным на ascii или UTF-8.

Покажите нам код, в котором вы "сказали, чтобы определить, какую кодировку я использую (iso-8859-9)".

Обновление 2 в ответ на публикацию отправляющего кода и этого комментария "Я добавляю # -*- coding: iso-8859-9 -*- в начало".

Помещение «кодирования» в начало вашего исходного файла говорит компилятору Python о кодировке оставшейся части вашего исходного файла . Это не имеет ничего общего с кодировкой ваших данных . Вы можете удалить # coding и вместо записи 'mdata' : 'IıışŞşÖÖççç' вы можете написать 'mdata' : 'I\xFD\xFD etc etc' и получить ту же строку байтов, отправленную на сервер с тем же эффектом. Вы НЕ сообщили appengine, какую кодировку вы используете.

вместо

"Content-type": "application/x-www-form-urlencoded"

Я предлагаю вам попробовать это:

"Content-Type": "application/x-www-form-urlencoded; charset:ISO-8859-9;"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...