我在Python中做了一些脚本,这些脚本连接到Gmail并打印了电子邮件文本...但是,我的电子邮件通常带有“ Accent”的单词。还有我的问题...

例如,我得到的文本:“ Plano de s = C3 = 9ADE”应以“ Plano desaúde”印刷。

我如何将我的电子邮件文字倾斜?我可以用什么用口音转换这些字母?

谢谢,


Andrey建议的代码在Windows上正常工作,但是在Linux上,我仍然遇到错误的打印:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÃDE

拉斐尔,

谢谢,您对这个词是正确的,它拼错了。但是这里的问题仍然一样。另一个示例:正确的单词:obersevação

>>> b = 'Observa=C3=A7=C3=B5es'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
Observações

我正在将Debian与UTF-8语言环境一起使用:

>>> :~$ locale
LANG=en_US.UTF-8

安德烈,

谢谢你的时间。我同意您的解释,但在这里仍然有同样的问题。看我的测试:

   s='Observa=C3=A7=C3=B5es'
   s2= s.decode('quopri').decode('utf-8')

   >>> print s

   Observa=C3=A7=C3=B5es

   >>> print s2

   Observações

   >>> import locale

   >>> ENCODING = locale.getpreferredencoding()

   >>> print s.encode(ENCODING)
   Observa=C3=A7=C3=B5es

   >>> print s2.encode(ENCODING)
   Observações

   >>> print ENCODING
   UTF-8
有帮助吗?

解决方案

此编码称为引用打印机。在您的示例中,您有一个字符串(Python的 unicode)编码在UTF-8字节中(Python's str)用引用的可打印字节编码。因此,获得字符串值的正确方法是:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE

更新: 但是,控制台康复可能会有一些问题。 s 拥有一个完全正确的Unicode字符串值(Python类型的 unicode)。但是当您使用 print 声明,价值 必须 转换为字节(Python's str)为了写入OS文件描述符编号 1 (标准输出管)。所以 print 声明实施检查您的控制台编码,然后进行一些猜测并打印结果。实际上,在Python 2中,从交互式外壳打印,非交互性运行过程并运行过程时,结果将有所不同,同时将输出重定向到文件。

不同意在Python 2中输出编码字符串的最佳方法。最有意义的两种方法是:

1)使用 locale的编码猜测和手动编码字符串。

import locale
ENCODING = locale.getpreferredencoding()

print s.encode(ENCODING)

2)使用编码选项(命令行,硬编码或其他)。

from getopt import getopt
ENCODING = 'UTF-8'
opts, args = getopt(sys.argv[1:], '', ['encoding='])
for opt, arg in opts:
    if opt == '--encoding':
        ENCODING = arg

print s.encode(ENCODING)

更新2: 如果没有任何帮助,并且您仍然确定您的控制台编码和字体设置为UTF-8,请尝试以下操作:

import sys, os
ENCODING = 'UTF-8'
stdout = os.fdopen(sys.stdout.fileno(), 'wb')
s = u'привет' # Don't forget to use a Unicode literal staring with u''
stdout.write(s.encode(ENCODING))

此时你 必须 看到俄语单词 привет 在您的控制台中设置的西里尔字符:)

如果是这种情况,那么您应该使用此二进制 stdout 而不是正常 sys.stdout.

其他提示

您的字符串错了,看:

'PLANO DE S=C3=9ADE' == 'PLANO DE S\xc3\x9aDE'

Saúde中缺少的“ A”在哪里?

如果您解码 'PLANO DE S=C3=9ADE' 作为引用打印机,您只会获得“ Plano deSúde”。

在Linux(Ubuntu 9.10)上运行此代码:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top