我在python中做了一些连接到GMAIL并打印电子邮件文本的脚本......但是,我的电子邮件通常都带有“重音”字样。还有我的问题......
例如我得到的文字:“PLANO DE S = C3 = 9ADE”应打印为“PLANODESAÚDE”。
如何将我的电子邮件文字清晰易读?我可以用什么来用带重音来转换这些字母?
谢谢,
安德烈建议的代码在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
答案 0 :(得分:4)
此编码称为Quoted-printable。在您的示例中,您有一个以引用的可打印字节编码的UTF-8字节(Python的unicode
)编码的字符串(Python 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的str
)才能写入OS文件描述符编号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
。
答案 1 :(得分:0)
你的字符串错了,看:
'PLANO DE S=C3=9ADE' == 'PLANO DE S\xc3\x9aDE'
SAÚDE中缺少的“A”在哪里?
如果您将'PLANO DE S=C3=9ADE'
解码为quoted-printable,则只会获得'PLANODESÚDE'。
在linux上运行此代码(Ubuntu 9.10):
>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE