1

Я написал код для подключения к imap, а затем проанализировал информацию о теле и вставлял в базу данных. Но у меня проблемы с акцентами.Ошибка кодирования с использованием Python

Из заголовка, я получил эту информацию:

Content-Type: text/html; charset=ISO-8859-1

Но я не уверен, что может доверять эту информацию ...

электронная почта была написана в португальском, таким образом, мы имеем много слов с акцентами. Например, я извлечь следующую фразу из исходной электронной коды (с помощью моего браузера):

"...instalação de eletrônicos..."

Итак, я подключился к IMap и принес несколько писем:

... typ, data = M.fetch(num, '(RFC822)') ...

При печати содержимого, Я получаю следующее слово:

print data[0][1] 
instala+º+úo de eletr+¦nicos 

Я пытался использовать .decode('utf-8'), но я не имел успеха.

instalação de eletrônicos

Как я могу сделать это человеком для чтения? Моя база данных находится в utf-8.

+0

Python2 или Python3? –

+1

Что означает 'print (type (data [0] [1])); print (repr (данные [0] [1])) 'print? –

+0

@WinstonEwert - Python 2.7 – Thomas

ответ

0

В заголовке указано, что используется кодировка ISO-8859-1. Поэтому вам нужно декодировать строку с этой кодировкой.

Попробуйте это:

data[0][1].decode('iso-8859-1') 
+0

Это не приведет к двойным байтам, ОП. Посмотрим, что дает нам моя просьба о типе и репрезентации данных, не так ли? –

+0

Он возвратил следующую ошибку: UnicodeEncodeError: кодек 'charmap' не может кодировать символ u '\ x83' в позиции 20: символьные карты до Thomas

0

Указание кодировки исходного кода работал для меня. Это код вверху моего примера кода ниже. Это должно быть определено в верхней части вашего файла python.

#!/usr/bin/python 
# -*- coding: iso-8859-15 -*- 

value = """...instalação de eletrônicos...""".decode("iso-8859-15") 
print value 
# prints: ...instalação de eletrônicos... 

import unicodedata 
value = unicodedata.normalize('NFKD', value).encode('ascii','ignore') 
print value 
# prints: ...instalacao de eletronicos... 

И теперь вы можете сделать str (значение) без исключения.

См: http://docs.python.org/2/library/unicodedata.html

Это, кажется, сохранить все акценты:

#!/usr/bin/python 
# -*- coding: iso-8859-15 -*- 
import unicodedata 
value = """...instalação de eletrônicos...""".decode("iso-8859-15") 
value = unicodedata.normalize('NFKC', value).encode('utf-8') 
print value 
print str(value) 

# prints (without exceptions/errors): 
# ...instalação de eletrônicos... 
# ...instalação de eletrônicos... 

EDIT:

Обратите внимание, что с последней версией, даже если результат выглядит так же, что Безразлично» t return равно True. В примере:

#!/usr/bin/python 
# -*- coding: iso-8859-15 -*- 
import unicodedata 
inValue = """...instalação de eletrônicos...""".decode("iso-8859-15") 
normalizedValue = unicodedata.normalize('NFKC', inValue).encode('utf-8') 

try: 
    print inValue == normalizedValue 
except UnicodeWarning: 
    pass 
# False 

EDIT2:

Это возвращает то же самое:

normalizedValue = unicode("""...instalação de eletrônicos...""".decode("iso-8859-15")).encode('utf-8') 
print normalizedValue 
print str(normalizedValue) 

# prints (without exceptions/errors): 
# ...instalação de eletrônicos... 
# ...instalação de eletrônicos... 

Хотя я не уверен, что это на самом деле будет действителен для кодированной базы данных UTF-8. Возможно нет?

0

Спасибо за Martijn Pieters. Мы выяснили, что письмо имело два разных кодировки. Мне пришлось разделить эти части и лечить индивидуально.