Чтение текста с помощью Accent - Python - PullRequest
2 голосов
/ 10 сентября 2010

Я написал скрипт на python, который подключается к GMAIL и печатает текст электронной почты ... Но часто в моих электронных письмах есть слова с "акцентом". И есть моя проблема ...

Например, полученный мной текст: «PLANO DE S = C3 = 9ADE» должен быть напечатан как «PLANO DE SA DEDE».

Как мне сделать текст моего письма разборчивым? Что я могу использовать для преобразования этих букв с акцентом?

Спасибо


Код, предложенный Андреем, отлично работает на 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 ]

4 голосов
/ 10 сентября 2010

Эта кодировка называется Quoted-printable. В вашем примере у вас есть строка (Python unicode), закодированная в байтах UTF-8 (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) для записи в номер дескриптора файла ОС 1 (стандартный канал вывода). Таким образом, реализация оператора print проверяет кодировку консоли, затем делает некоторые предположения и печатает результаты. Фактически, в Python 2 результаты будут отличаться для печати из интерактивной оболочки, если ваш процесс будет выполняться не в интерактивном режиме, а процесс будет выполняться при перенаправлении вывода в файл.

Наилучший способ вывода закодированных строк в 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.

0 голосов
/ 10 сентября 2010

Ваша строка неверна, посмотрите:

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

Где пропущенная буква "A" в SAÚDE?

Если вы расшифруете 'PLANO DE S=C3=9ADE' как печатный материал, указанный в кавычках, вы получите только «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
...