我正在尝试将加密的查询字符串传递给另一个网址。
以下代码给出了这个错误:
UnicodeEncodeError:'ascii'编解码器无法对字符u'\ u04b7'进行编码 位置7:序数不在范围内(128)
加密模块为PyCrypto
在App Engine上运行Python 2.5.2
import Crypto
from Crypto.Cipher import ARC4
obj=ARC4.new('stackoverflow')
msg = 'This is my secret msg'
encrypted = obj.encrypt(msg);
self.redirect('/pageb?' + urllib.urlencode({'q': encrypted}))
import Crypto
from Crypto.Cipher import ARC4
encrypted = self.request.get('q')
obj=ARC4.new('stackoverflow')
decrypted = obj.decrypt(encrypted)
get_data = cgi.parse_qs(decrypted)
self.response.out.write(decrypted)
self.response.out.write(pprint.pprint(get_data))
回溯
Traceback (most recent call last):
File "C:\Program Files\Google\google_appengine\google\appengine\ext\webapp\_webapp25.py", line 701, in __call__
handler.get(*groups)
File "C:\Program Files\Google\google_appengine\demos\guestbook\guestbook.py", line 47, in get
decrypted = obj.decrypt(encrypted)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u04b7' in position 7: ordinal not in range(128)
答案 0 :(得分:6)
一般准则:在加密的内容中添加base64编码/解码步骤。
import base64
base64_encrypted_message = base64.b64encode(encrypted_message)
// send your message via POST as GET can be seen on system logs
encrypted_message = base64.b64decode(base64_encrypted_message)
// decrypt your message
对于其他错误,请尝试阅读非{ascii字符的unicode & utf-8编码。在将其传递给de / encrypt函数之前,您需要执行此步骤。
答案 1 :(得分:1)
所有可以从可用信息中推断出的是,某些东西需要一个字节串,但你已经为它提供了一个unicode
对象,其中包含Unicode字符U + 04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER ...这是当然不能用ASCII编码(默认编码),因此错误信息。
目前为止最好的答案:不要这样做。
更新1:您还没有问过问题。尽管如此:
所以“某些东西”是一些加密小工具的decrypt
方法。这肯定需要一个str
对象。 print repr(encrypted)
告诉你什么?如果它看起来像随机垃圾(作为加密的东西应该),那么它已经以某种方式从str
对象转换为unicode
对象。您需要回溯以查看这是如何发生的。如果encrypted
看起来像有意义的文本,那么您的加密过程就会中断。
步骤1:从一些已知的明文开始,对其进行加密,然后在GAE设备外部的简单脚本中再次对其进行解密。在每个阶段使用print repr(),以便您对下一步有合理的期望。
步骤2:使用GAE重复步骤1,检查每个数据的类型和内容。
更新2 您可以在页面A中找到urlencode
,但在页面B中没有相应的urldecode
;这是(部分)问题吗?