Python M2Crypto RSA Unicode字符串与字节字符串编码不同

Python M2Crypto RSA Unicode字符串与字节字符串编码不同,python,encryption,unicode,m2crypto,Python,Encryption,Unicode,M2crypto,我使用PythonM2Crypto的RSA和PKCS1填充对电子邮件进行编码,以便与外部网站的API一起使用。当使用unicode时,编码的电子邮件没有从API返回任何结果,但是当我使用str(unicode_电子邮件)时,我收到了正确的信息 我的印象是,字符串的unicode和字节表示在这种情况下都应该起作用。有人知道unicode失败的原因吗 参考代码: from M2Crypto import RSA email = u'email@example.com' #fails email =

我使用PythonM2Crypto的RSA和PKCS1填充对电子邮件进行编码,以便与外部网站的API一起使用。当使用unicode时,编码的电子邮件没有从API返回任何结果,但是当我使用str(unicode_电子邮件)时,我收到了正确的信息

我的印象是,字符串的unicode和字节表示在这种情况下都应该起作用。有人知道unicode失败的原因吗

参考代码:

from M2Crypto import RSA
email = u'email@example.com'  #fails
email = str(email)  # succeeds 
rsa = RSA.load_pub_key('rsa_pubkey.pem')
result = rsa.public_encrypt(email, RSA.pkcs1_padding).encode('base64')

M2Crypto模块专门处理不透明字节,这些字节的值介于0和255之间,表示为python
str
类型

Python2.x
str
类型由这样的字节组成,但是
unicode
类型是完全不同的。您可以使用和的镜像方法轻松地在两者之间进行转换

unicode
对象上调用
str()
时,它通过应用默认编码进行转换,本质上它调用
email.encode(sys.getdefaultencoding())
。这对于您的所有ASCII电子邮件地址来说都很好,但是您肯定会遇到
unicodeincodeerror
异常以及其他任何异常。最好只使用显式方法

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


我强烈建议您仔细阅读。

字符通常为1字节宽。。。。unicode通常有2个字节宽。。。(至少是afaik…(特定于操作系统?)而且我很确定它应该是1字节宽的characters@JoranBeasley请阅读。Unicode不是字符编码,也与字节无关,但事实上,您不能将所有Unicode代码点都放入16位,因为其中有超过2^16个。@delnan谢谢。。。已添加书签以便以后阅读。。但好吧,我承认:)谢谢。我也会读的。:)