Кодировать Unicode для iso8859-15 с Python

Я использую Python 2.7.6, и я пытаюсь преобразовать базовую строку Unicode в iso8859-15.

Я получаю сообщение об ошибке при попытке преобразовать строку с не-ASCII-символами. Это было бы хорошо, когда эти символы не существовали бы, это кодировка iso8859-15, но в этом случае они делают:

Пример:

>>> import codecs
>>> a = "test"
>>> a
'test'
>>> a.encode ('iso8859-15')
'test'
>>> a = "ü"
>>> a
'\xfc'
>>> a.encode ('iso8859-15')

Код ошибки:

Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    a.encode ('iso8859-15')
  File "C:\Python27\lib\encodings\iso8859_15.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 0: ordinal not in range(128)

В этом случае "ü" является допустимым символом iso8859-15 с шестнадцатеричным значением fc или 11111100 в качестве двоичного файла. Глядя в "C:\Python27\lib\encodings\iso8859_15.py", вы найдете значение FC в строке 300:

    47:  decoding_table = (
    48:  u'\x00'     #  0x00 -> NULL
    .....
    300: u'\xfc'     #  0xFC -> LATIN SMALL LETTER U WITH DIAERESIS 

Как я могу преобразовать строки Unicode с не-ascii символами, такими как "ü", в 'iso8859-15'? Если функция кодирования не работает в этом случае: Как я могу импортировать список encoding_table из lib \ encodings \ iso8859_15.py прямо в мой код?

1 ответ

Решение

Вы пытаетесь закодировать строку байтов. Битовая строка уже закодирована, поэтому Python сначала пытается ее декодировать, чтобы потом снова ее кодировать, и для этого он использует ASCII.

Исключение отражает это; ты получил UnicodeDecodeErrorне UnicodeEncodeError,

Для создания значений Unicode используйте u'...' вместо литералов Unicode:

>>> a = u'ü'
>>> a
u'\xfc'
>>> a.encode('iso8859-15')
'\xfc'

или декодируйте ваши данные байтов в Unicode, используя правильную кодировку:

>>> a = 'ü'
>>> a.decode('utf8')  # my terminal is configured to use UTF-8
u'\xfc'
>>> a.decode('utf8').encode('iso8859-15')
'\xfc'
Другие вопросы по тегам