преобразование кодировки Python - PullRequest
5 голосов
/ 28 июня 2011

Вот моя проблема, у меня неверно закодированная переменная, которую я хочу исправить. Короче говоря, я заканчиваю с:

myVar=u'\xc3\xa9'

, что неверно, потому что это символ 'é' или \u00e9 в кодировке UTF-8, а не в кодировке Unicode.

Ни одна из комбинаций кодирования / декодирования, которые я пробовал, кажется, не решает проблему. Я посмотрел в сторону объекта bytearray, но вы должны предоставить кодировку, и, очевидно, ни одна из них не подходит.

В основном мне нужно переосмыслить байтовый массив в правильную кодировку. Есть идеи, как это сделать? Спасибо.

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

Что вы должны были сделать.

>>> b='\xc3\xa9'
>>> b
'\xc3\xa9'
>>> b.decode("UTF-8")
u'\xe9'

Поскольку вы не показали неработающий код, вызвавший проблему, все, что мы можем сделать, - это сделать сложную проблему более сложной.

Похоже, это то, что вы видите.

>>> c
u'\xc3\xa9'
>>> c.decode("UTF-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

Вот обходной путь.

>>> [ chr(ord(x)) for x in c ]
['\xc3', '\xa9']
>>> ''.join(_)
'\xc3\xa9'
>>> _.decode("UTF-8")
u'\xe9'

Исправьте код, из-за которого возникли неправильные вещи.

1 голос
/ 28 июня 2011

Хакерское решение: вытащите кодовые точки с помощью ord, затем создайте из них символы (строки длины один) с помощью chr, затем вставьте все вместе и декодируйте.

>>> u = u'\xc3\xa9'
>>> s = ''.join(chr(ord(c)) for c in u)
>>> unicode(s, encoding='utf-8')
u'\xe9'
...