2012-09-04 158 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中的所有內容。