Вопрос

Я сделал какой-то скрипт в Python, который подключается к Gmail и распечатает текст электронной почты ... Но, часто мои электронные письма имеют слова с «акцентом». И есть моя проблема ...

Например, текст, который я получил: «Plano de S = C3 = 9ade» должен быть напечатан как «Plano de Saú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 с NOTF-8 Locale:

>>> :~$ 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's's's 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's 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.

Другие советы

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

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

Где пропал «А» в Сауде?

Если вы декодируете '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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top