我在python中做了一些脚本,连接到GMAIL并打印电子邮件文本…但是,我的电子邮件经常带有“重音”的单词。 还有我的问题…
例如,我得到一个文本:“PLANO DE S = C3 = 9ADE”应打印为“PLANO DESAÚDE”。
我怎样才能把我的电子邮件文本变成清晰的? 我可以用什么来转换这些带有口音的字母?
谢谢,
Andreybuild议的代码,在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
我正在用UTF-8语言环境使用Debian:
>>> :~$ locale LANG=en_US.UTF-8
安德烈,
谢谢你的时间。 我同意你的解释,但在这里仍然有同样的问题。 看看我的testing:
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's str
)编码的引用可打印字节的字符串(Python的unicode
)。 所以得到一个字符串值的正确方法是:
>>> b = 'PLANO DE S=C3=9ADE' >>> s = b.decode('quopri').decode('utf-8') >>> print s PLANO DE SÚDE
更新:虽然控制台conding可能会有一些问题。 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
。
你的字符串是错的,看:
'PLANO DE S=C3=9ADE' == 'PLANO DE S\xc3\x9aDE'
SAÚDE中缺少的“A”在哪里?
如果您将'PLANO DE S=C3=9ADE'
解码为引用'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