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

StackOverflow https://stackoverflow.com/questions/819396

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

РЕДАКТИРОВАТЬИли, может быть, попробуйте s.decode('ascii') вашу строку (учитывая, что s — это имя переменной).Если он выдает UnicodeDecodeError, декодируйте его как «utf_16_le».

Что в файлах? Если это обычный текст на основе латинского алфавита, почти каждый второй байт файлов UTF-16LE будет равен нулю. С другой стороны, в файлах windows-1252 я не ожидал бы увидеть нули вообще. Например, вот & # 8220; Hello & # 8221; в 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, добавляя сопоставления для нескольких печатаемых символов & # 8212; например, фигурные кавычки & # 8212; заменять управляющие символы в диапазон 0x80..0x9F ).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top