Чтение текста с акцентом - Python
-
02-10-2019 - |
Вопрос
Я сделал какой-то скрипт в 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