用Accent – Python阅读文本

我在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