用口音阅读文本 - Python

时间:2010-09-09 20:33:45

标签: python linux utf-8 quoted-printable diacritics

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

2 个答案:

答案 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