Python: преобразование из ISO-8859-1/latin1 к UTF-8


У меня есть эта строка, которая была декодирована из Quoted-printable в ISO-8859-1 с модулем электронной почты. Это дает мне строки типа "xC4pple", которые будут соответствовать" Äpple " (Apple на шведском языке). Однако, я не могу преобразовать эти строки в UTF-8.

>>> apple = "xC4pple"
>>> apple
'xc4pple'
>>> apple.encode("UTF-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in     range(128)

Что делать?

5 69

5 ответов:

попробуйте сначала декодировать его, а затем кодировать:

apple.decode('iso-8859-1').encode('utf8')

это распространенная проблема, поэтому вот относительно тщательная иллюстрация.

для строк без Юникода (т. е. без u префикс как u'\xc4pple'), необходимо декодировать из собственной кодировки (iso8859-1/latin1, если изменено с загадочным sys.setdefaultencoding и своя логика кодирования, установлено sys.stdout.encoding и по умолчанию UTF-8

  • нужно расшифровать a str в unicode перед преобразованием в другую кодировку.
  • конечно, все это меняется в Python 3.x.

    надеюсь, что это освещает.

    далее чтение

    и очень показательные разглагольствования Армина Ронахера:

    декодировать в Юникод, кодировать результаты в UTF8.

    яблоко.декодирования('латинских типа 1').encode ('utf8')

    Для Python 3:

    bytes(apple,'iso-8859-1').decode('utf-8')
    

    я использовал это для текста, неправильно закодированного как iso-8859-1 (показаны такие слова, как VeÅ\x99ejné) вместо utf-8. Этот код создает правильную версию Veřejné.

    понятие = понятие.encode ('ascii',' ignore') concept = MySQLdb.escape_string(концепция.декодирования('латинских типа 1').кодирование ('utf8').rstrip())

    Я делаю это, я не уверен, если это хороший подход, но он работает каждый раз !!