【问题标题】:Reading Text with Accent - Python用口音阅读文本 - Python
【发布时间】:2011-04-10 11:16:43
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    这种编码称为 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

    【讨论】:

    • Andrey,这个解决方案在 Windows 上运行良好。但在 Linux 上,字符仍然不可读:
    【解决方案2】:

    你的字符串错了,看:

    '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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      相关资源
      最近更新 更多