Я использую мутаген для преобразования данных тегов 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')
... Но я получаю ту же ошибку.
Ваша строка 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'