python - 阅读带重音的文本 - Python

标签 python linux utf-8 quoted-printable diacritics

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

我使用 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

最佳答案

这种编码称为 Quoted-printable。在您的示例中,您有一个以 UTF-8 字节(Python 的 str)编码的字符串(Python 的 unicode),并以带引号的可打印字节编码。所以获取字符串值的正确方法是:

>>> 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)才能写入操作系统文件描述符编号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

关于python - 阅读带重音的文本 - Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3680352/

相关文章:

ruby - 现在有哪些选项可以在 Ruby 和 RoR 中实现 UTF8?

Delphi 2009 RawByteString 变幻莫测

python - tensorflow 错误 : 'FileWriter' method

python - 迭代搜索循环列表

python - 使用opencv识别OCR期间的元音字符

python - 多实例Django论坛软件

regex - 使用 grep 将正则表达式匹配组重新组合成新字符串

linux - 列出编译对象使用的指令集 - 适用于 ARM 和 X86

regex - ubuntu命令行中的正则表达式

java - 运行 Java 工件时显示 Unicode 字符出现问题,但在 IntelliJ IDEA 中运行时一切正常