Текстовое кодирование Python - PullRequest
0 голосов
/ 16 декабря 2010

У меня есть этот текст в файле - Recuérdame (обратите внимание, это французское слово).Когда я читаю этот файл с помощью скрипта Python, я получаю этот текст как Recuérdame.

Я читаю его как строку UnicodeНужно ли найти кодировку текста и расшифровать это?или мой терминал обманывает меня?

Ответы [ 4 ]

5 голосов
/ 16 декабря 2010

Да, вам нужно знать кодировку текстового файла, чтобы превратить его в строку Unicode (из байтов, составляющих файл).

Например, если вы знаете, кодировка UTF-8:

with open('foo.txt', 'rb') as f:
    contents = f.read().decode('utf-8-sig')   # -sig takes care of BOM if present

Однако текст в вашем файле не закодирован в Юникоде;акцентированный символ, очевидно, хранится в виде XML-сущности, которую нужно преобразовать вручную (подсказка jleedev для ссылки).

1 голос
/ 16 декабря 2010

Это , а не строка Unicode.Это строка в любой кодировке, в которой она закодирована. Следовательно, это строка UTF-8, Latin-1 или что-то еще.В этом случае &#xE9 является сущностью HTML / XML, представляющей, в частности, é.Это кодировка, используемая в HTML и XML для кодирования не-ascii данных.

Чтобы декодировать это в Unicode, посмотрите на метод Фредрика Лунда: http://effbot.org/zone/re-sub.htm#unescape-html

0 голосов
/ 23 декабря 2012

Работа с xlrd у меня в строке ... xl_data.find (ул (CELL_VALUE)) ... что выдает ошибку: «кодек ascii не может закодировать символ u '\ xdf' в позиции 3: порядковый номер не в диапазоне (128)». Все предложения на форумах были бесполезны для моих немецких слов. Но меняется на: ... xl_data.find (cell.value) ... не дает ошибок. Итак, я предполагаю, что использование строк в качестве аргументов в определенных командах с xldr имеет определенные проблемы с кодированием.

0 голосов
/ 16 декабря 2010

Это HTML, и эта конструкция называется «сущность».Вы можете использовать

def entity_decode(match):
    _, is_hex, entity = match.groups()
    base = 16 if is_hex else 10
    return unichr(int(entity, base))

print re.sub("(?i)(&#(x?)([^;]+);)", 
       entity_decode,
       "Recurdame")

для декодирования всех этивий.

Редактировать: Да, они, конечно, не латиноамериканские1, теперь он должен работать со всеми сущностями

...