2012-09-04 105 views
0

我使用Python M2Crypto的RSA和PKCS1填充对外部网站API使用的电子邮件进行编码。使用unicode时,编码的电子邮件不会返回API的结果,但是当我使用str(unicode_email)时,我收到了正确的信息。M2Crypto RSA Unicode字符串编码不同于字节字符串

我的印象是,在这种情况下,字符串的unicode和byte表示都应该起作用。有谁知道unicode为什么失败?

代码以供参考:

from M2Crypto import RSA 
email = u'[email protected]' #fails 
email = str(email) # succeeds 
rsa = RSA.load_pub_key('rsa_pubkey.pem') 
result = rsa.public_encrypt(email, RSA.pkcs1_padding).encode('base64') 
+0

字符通常是1个字节宽.... unicode通常是2个字节宽...(至少afaik ...(操作系统特定?)),我很确定它期待1字节宽字符 –

+2

@JoranBeasley请阅读[绝对最低限度的每个软件开发人员,肯定必须知道Unicode和字符集(无借口!)](http://www.joelonsoftware.com/articles/Unicode.html)。 Unicode不是一种字符编码,并且不涉及字节,但事实上,您不能将所有unicode代码点放入16位,因为其中有2^16个以上。 – delnan

+0

@delnan谢谢...收藏后阅读..但是是的好吧点承认:) –

回答

1

的M2Crypto模块只与不透明字节,它是0和255之间的值,表示为蟒str类型的交易。

Python 2.x str类型由这样的字节组成,但unicode类型是完全不同的野兽。您可以通过使用.decode() method和镜像方法.encode()轻松地在两者之间进行转换。

当您在unicode对象上调用str()时,它会通过应用默认编码进行转换,本质上它会调用email.encode(sys.getdefaultencoding())。对于您的全ASCII电子邮件地址,这很好,但您必然会遇到其他任何异常情况,例如UnicodeEncodeError。更好地坚持只使用显式方法。

请注意,您可能必须设置您在发送的电子邮件的MIME标题上使用的编码。

我强烈建议您阅读Python Unicode HOWTO中的所有内容。