Python-gpgme-nonascii文本处理

2024-04-20 09:18:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用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)

Tags: key代码文本套件电子邮件mac字符gpg
1条回答
网友
1楼 · 发布于 2024-04-20 09:18:14

这里有很多问题。你真的应该读一下Unicode HOWTO,但我会尽力解释的。在


payload = 'Просто тест'

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字符串。像这样:

payload = u'Просто тест'

现在,最后,您可以实际将有效负载编码为UTF-8,您在第一次尝试中做得非常正确:

plain = BytesIO(payload.encode('utf-8'))

最后,使用GPG加密UTF-8纯文本。当你在另一边解密时,一定要在那里把它解码成UTF-8,否则你可能会再次看到无稽之谈。在

相关问题 更多 >