Appengine将unicode char转换为urllib.unquote中的空白字符

时间:2011-10-28 21:44:31

标签: python google-app-engine

我正在将编码后的数据发送到appengine项目。但是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。我测试了。还有其他发源中的字符?

感谢您的帮助。

抱歉我的英文不好

更新:

这是我的发件人功能

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()

这是appengine代码:

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:如果您使用的是unicode字符集,则将其解码为您的字符集,之后您可以将其编码为utf-8。

2 个答案:

答案 0 :(得分:0)

您发送的内容似乎是对以cp1254(Windows土耳其语)编码(或非常相似的ISO-8859-9编码)表示的某些字符进行网址编码的结果。你告诉“appengine”你正在使用什么编码?

我们需要更多关于“仍然像unicode chars”的信息İşÇöÖü“空白”。你看他们怎么空白?而不是

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设置为asciiUTF-8的内容。

向我们展示您“告诉我们正在使用的编码(iso-8859-9)”的代码。

更新2 以回复发送代码和此评论“我正在将# -*- coding: iso-8859-9 -*-添加到顶部”。

将“编码”事物放在源文件的顶部是告诉Python编译器源文件的其余部分的编码。它与数据的编码无关。您可以删除#code事件,而不是编写'mdata' : 'IıışŞşÖÖççç',您可以编写'mdata' : 'I\xFD\xFD etc etc'并获得发送到服务器的相同字节串,效果相同。您有 NOT 告诉appengine您正在使用的编码。

而不是

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

我建议你试试这个:

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

答案 1 :(得分:0)

尝试在urlencoding之前将其转换为"utf-8"

mdata_ue = "I%FD%FD%FE%DE%DE%E7%E7%C7%D6%F6%F6%D6%D6%0A%0A"
mdata = urllib.unquote_plus(mdata_ue).decode('iso-8859-9')
print urllib.quote_plus(mdata.encode('utf-8'))

输出:

I%C4%B1%C4%B1%C5%9F%C5%9E%C5%9E%C3%A7%C3%A7%C3%87%C3%96%C3%B6%C3%B6%C3%96%C3%96\
%0A%0A