Как преобразовать строку из CP-1251 в UTF-8?

Я использую мутаген для преобразования данных тегов ID3 ​​из CP-1251 / CP-1252 в UTF-8. В линуксе проблем нет. Но в Windows вызов SetValue () в wx.TextCtrl вызывает ошибку:

UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xc3 в позиции 0: порядковый номер не в range (128)

Исходная строка (предположительно в кодировке CP-1251), которую я извлекаю из мутагена :

u'\xc1\xe5\xeb\xe0\xff \xff\xe1\xeb\xfb\xed\xff \xe3\xf0\xee\xec\xf3'

Я попытался преобразовать ее в UTF-8:

dd = d.decode('utf-8')

... и даже изменение кодировки по умолчанию с ASCII на UTF-8:

sys.setdefaultencoding('utf-8')

... Но я получаю ту же ошибку.

23
задан Peter Mortensen 24 October 2015 в 11:22
поделиться

1 ответ

Ваша строка d является строкой Unicode, не строкой в ​​кодировке UTF-8! Так что вы не можете decode() это сделать, вы должны encode() передать его в UTF-8 или в любую другую кодировку, которая вам нужна.

>>> d = u'\xc1\xe5\xeb\xe0\xff \xff\xe1\xeb\xfb\xed\xff \xe3\xf0\xee\xec\xf3'
>>> d
u'\xc1\xe5\xeb\xe0\xff \xff\xe1\xeb\xfb\xed\xff \xe3\xf0\xee\xec\xf3'
>>> print d
Áåëàÿ ÿáëûíÿ ãðîìó
>>> a.encode("utf-8")
'\xc3\x81\xc3\xa5\xc3\xab\xc3\xa0\xc3\xbf \xc3\xbf\xc3\xa1\xc3\xab\xc3\xbb\xc3\xad\xc3\xbf \xc3\xa3\xc3\xb0\xc3\xae\xc3\xac\xc3\xb3'

(это то, что вы должны делать в самом конце всей обработки, когда вам необходимо сохранить его, например, в кодированном формате UTF-8).

Если ваш ввод в другой кодировке, то все наоборот:

>>> d = "Schoßhündchen"                 # native encoding: cp850
>>> d = "Schoßhündchen".decode("cp850") # decode from Windows codepage
>>> d                                   # into a Unicode string (now work with this!)
u'Scho\xdfh\xfcndchen'
>>> print d                             # it displays correctly if your shell knows the glyphs
Schoßhündchen
>>> d.encode("utf-8")                   # before output, convert to UTF-8
'Scho\xc3\x9fh\xc3\xbcndchen'
5
ответ дан 29 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: