Как преобразовать символы в кодировке \ xXY в UTF-8 в Python? - PullRequest
5 голосов
/ 19 января 2011

У меня есть текст, который содержит такие символы, как "\ xaf", "\ xbe", которые, как я понимаю из этого вопроса , представляют собой символы в кодировке ASCII.

Я хочу преобразовать их в Python в их эквиваленты UTF-8. Обычные string.encode("utf-8") броски UnicodeDecodeError. Есть ли какой-нибудь лучший способ, например, с помощью стандартной библиотеки codecs?

Пример 200 символов здесь .

Ответы [ 3 ]

3 голосов
/ 19 января 2011

.encode - для преобразования строки Unicode (unicode в 2.x, str в 3.x) в байтовую строку (str в 2.x, bytes в 3.x).

В 2.x разрешено вызывать .encode для str объекта.Python неявно декодирует сначала строку в Unicode: s.encode(e) работает так, как если бы вы написали s.decode(sys.getdefaultencoding()).encode(e).

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

>>> '\xAF \xBE'.decode('ISO-8859-1').encode('UTF-8')
'\xc2\xaf \xc2\xbe'
2 голосов
/ 13 февраля 2011

Ваш файл уже является файлом в кодировке UTF-8.

# saved encoding-sample to /tmp/encoding-sample
import codecs
fp= codecs.open("/tmp/encoding-sample", "r", "utf8")
data= fp.read()

import unicodedata as ud

chars= sorted(set(data))
for char in chars:
    try:
        charname= ud.name(char)
    except ValueError:
        charname= "<unknown>"
    sys.stdout.write("char U%04x %s\n" % (ord(char), charname))

И вручную заполняя неизвестные имена:
символ U000a LINE FEED
char U001e ИНФОРМАЦИОННЫЙ СЕПАРАТОР ДВА
символ U001f ИНФОРМАЦИОННЫЙ СЕПАРАТОР ОДИН

2 голосов
/ 19 января 2011

Это не ASCII (коды ASCII увеличиваются только до 127; \xaf равно 175).Сначала вам нужно выяснить правильную кодировку, декодировать ее, а затем перекодировать в UTF-8.

Не могли бы вы предоставить реальный образец строки?Тогда мы можем, вероятно, угадать текущую кодировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...