我尝试使用pygpgme通过GPG加密解密文本,而它适用于西方字符解密失败的俄语文本。我使用Mac上的GPG套件来解密电子邮件。 下面是我用来生成加密电子邮件正文的代码,注意,我尝试用Unicode编码邮件,但没有任何区别。我使用python2.7。在
请帮忙,我得说我是Python新手。在
ctx = gpgme.Context()
ctx.armor = True
key = ctx.get_key('0B26AE38098')
payload = 'Просто тест'
#plain = BytesIO(payload.encode('utf-8'))
plain = BytesIO(payload)
cipher = BytesIO()
ctx.encrypt([key], gpgme.ENCRYPT_ALWAYS_TRUST, plain, cipher)
这里有很多问题。你真的应该读一下Unicode HOWTO,但我会尽力解释的。在
python2.x的源代码默认为拉丁语-1。但是你的来源显然不是拉丁语-1,因为拉丁语-1甚至没有这些字符。如果在一个程序(如文本编辑器)中将
Просто тест
写成UTF-8,然后在另一个程序(如Python)中以Latin-1的形式读取它,会发生什么情况?{cd2>得到你。所以,你所做的就是制造一个一串胡言乱语。如果你使用的是ISO-8859-5而不是UTF-8,这将是不同的废话,但仍然是无稽之谈因此,首先,您需要找出您在文本编辑器中使用了什么编码。如果你在Mac电脑上,可能是UTF-8,但不要只是猜测,要找出答案。在
其次,您必须告诉Python您使用了什么编码。您可以使用encoding declaration来完成此操作。例如,如果文本编辑器使用UTF-8,请在代码顶部添加以下行:
^{pr2}$如果您修复了这个问题,
payload
将是一个字节字符串,以文本编辑器使用的任何编码进行编码。但不能对已经编码的字节字符串进行编码,只能对Unicode字符串进行编码。在Python2.x将允许您对它们调用
encode
,但它并不是很有用,它将首先使用sys.getdefaultencoding
将字符串解码为Unicode,这样它就可以对其进行编码。这不太可能是你想要的。在解决这个问题的正确方法是首先使用Unicode文本使
payload
成为Unicode字符串。像这样:现在,最后,您可以实际将有效负载编码为UTF-8,您在第一次尝试中做得非常正确:
最后,使用GPG加密UTF-8纯文本。当你在另一边解密时,一定要在那里把它解码成UTF-8,否则你可能会再次看到无稽之谈。在
相关问题 更多 >
编程相关推荐