Python gpgme非ascii文本处理

时间:2014-02-18 02:20:59

标签: python encryption

我正在尝试使用pygpgme通过GPG加密解密文本,而它适用于西方字符解密在俄语文本上失败。我在Mac上使用GPG套件来解密电子邮件。 这是我用来生成加密电子邮件正文的代码,请注意我尝试用Unicode编码邮件,但它没有任何区别。我使用Python 2.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)

1 个答案:

答案 0 :(得分:0)

这里有很多问题。你真的应该阅读Unicode HOWTO,但我会尝试解释。


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

Python 2.x源代码默认为Latin-1。但是你的来源显然不是Latin-1,因为Latin-1甚至没有拥有那些字符。如果在一个程序(如文本编辑器)中将Просто тест写为UTF-8,然后在另一个程序(如Python)中将其作为Latin-1读取,会发生什么?你得到ÐÑоÑÑо ÑеÑÑ。所以,你正在做的是创建一个充满废话的字符串。如果您使用的是ISO-8859-5而不是UTF-8,那将是不同的废话,但仍然是无稽之谈

因此,首先,您需要找出所做的在您的文本编辑器中使用的编码。它可能可能 UTF-8,如果你在Mac上,但不要只是猜测;找出来。


其次,您必须告诉Python您使用的编码。您可以使用encoding declaration来完成此操作。例如,如果文本编辑器使用UTF-8,请将此行添加到代码顶部:

# coding=utf-8

您解决了这个问题,payload将是一个字节字符串,以您的文本编辑器使用的任何编码进行编码。但是你不能编码已编码的字节字符串,只能编码Unicode字符串。

Python 2.x会让你在它们上面调用encode,但它不是很有用 - 它会做的是首先使用sys.getdefaultencoding将字符串解码为Unicode,这样它就可以编码。这不太可能是你想要的。

解决此问题的正确方法是首先使用Unicode文字使payload成为Unicode字符串。像这样:

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

现在,最后,您实际上可以将有效负载编码为UTF-8,这是您在第一次尝试时完全正确完成的:

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

最后,您正在使用GPG加密UTF-8纯文本。当你在另一边解密它时,确保在那里解密它为UTF-8,或者你可能再次看到废话。