我用 python 做了一些脚本,连接到 GMAIL 并打印电子邮件文本...但是,我的电子邮件通常包含带有“重音”的单词。这就是我的问题...
例如,我收到的文本:“PLANO DE S=C3=9ADE”应打印为“PLANO DE SAÚ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
最佳答案
这种编码称为 Quoted-printable。在您的示例中,您有一个以 UTF-8 字节(Python 的 str
)编码的字符串(Python 的 unicode
),并以带引号的可打印字节编码。所以获取字符串值的正确方法是:
>>> 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的str
)才能写入操作系统文件描述符编号1
(标准输出管道)。因此,print
语句实现会检查您的控制台编码,然后进行一些猜测并打印结果。事实上,在 Python 2 中,从交互式 shell 打印、非交互式运行进程以及在将输出重定向到文件时运行进程的结果将有所不同。
在 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
。
关于python - 阅读带重音的文本 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3680352/