Лучший способ анализа файлов ANSI и UTF-16LE с использованием Python 2/3? - PullRequest
0 голосов
/ 04 мая 2009

У меня есть коллекция файлов, закодированных в ANSI или UTF-16LE. Я хотел бы, чтобы Python открывал файлы, используя правильную кодировку. Проблема заключается в том, что файлы ANSI не вызывают каких-либо исключений при кодировании с использованием UTF-16le и наоборот.

Есть ли простой способ открыть файлы, используя правильную кодировку файлов?

Ответы [ 3 ]

4 голосов
/ 04 мая 2009

Используйте библиотеку chardet для определения кодировки.

0 голосов
/ 05 мая 2009

Что в файлах? Если это обычный текст на основе латинского алфавита, почти каждый второй байт файлов UTF-16LE будет равен нулю. С другой стороны, в файлах windows-1252 я не ожидал бы увидеть нули вообще. Например, вот “Hello” в windows-1252:

93 48 65 6C 6C 6F 94

... и в UTF-16LE:

1C 20 48 00 65 00 6C 00 6C 00 6F 00 1D 20

Помимо фигурных кавычек, каждый символ отображается на одно и то же значение с добавлением завершающего нулевого байта. Фактически, это верно для каждого символа в наборе символов ISO-8859-1 (windows-1252 расширяет ISO-8859-1, добавляя сопоставления для нескольких печатных символов - например, фигурных кавычек - для замены управляющих символов в диапазоне 0x80..0x9F ).

Если вы знаете, что все файлы являются либо windows-1252, либо UTF-16LE, все, что вам нужно, чтобы выяснить, какой именно, - это быстрое сканирование на нули. Есть веская причина, почему Chardet такой медленный и сложный, но в этом случае я думаю, что вы можете сойти с рук быстро и грязно.

0 голосов
/ 04 мая 2009

Вы можете проверить BOM в начале файла, чтобы проверить, является ли это UTF.

Затем unicode.decode соответственно (с использованием одного из стандартных кодировок ).

EDIT Или, может быть, попробуйте s.decode ('ascii') свою строку (учитывая s это имя переменной). Если он выдает UnicodeDecodeError, то декодируйте его как 'utf_16_le'.

...