我正在将编码后的数据发送到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。
答案 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
设置为ascii
或UTF-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