2

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

我正在使用带有 UTF-8 语言环境的 Debian:

>>> :~$ 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
4

2 回答 2

4

这种编码称为 Quoted-printable。unicode在您的示例中,您有一个以 UTF-8 字节(Python's )编码的字符串(Python's ),以带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而不是 normal sys.stdout

于 2010-09-09T20:40:06.147 回答
0

你的字符串是错误的,看:

'PLANO DE S=C3=9ADE' == 'PLANO DE S\xc3\x9aDE'

SAÚDE中缺少的“A”在哪里?

如果您解码'PLANO DE S=C3=9ADE'为quoted-printable,您将只得到“PLANO DE SÚDE”。

在 linux (Ubuntu 9.10) 上运行此代码:

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
于 2010-09-10T18:31:11.283 回答