Как определить кодировку файла?

115

В моей файловой системе (Windows 7) у меня есть несколько текстовых файлов (это файлы сценариев SQL, если это имеет значение).

При открытии с помощью Notepad ++ в меню «Кодировка» сообщается, что некоторые из них имеют кодировку «UCS-2 Little Endian», а некоторые - «UTF-8 без BOM».

В чем здесь разница? Все они кажутся совершенно правильными сценариями. Как я могу сказать, какие кодировки у файла без Notepad ++?

завивать волосы щипцами
источник
7
Существует довольно простой способ использования Firefox. Откройте файл, используя Firefox, затем выберите «Просмотр»> «Кодировка символов». Подробно здесь .
Кэтрин Гаснье
использовать эвристику. Оформить заказ encaи chardetдля систем POSIX.
Янус Троелсен
3
Я думаю, что альтернативный ответ - TRIAL и ERROR. iconvв частности это полезно для этой цели. По сути, вы перебираете поврежденные строки символов / текста в различных кодировках, чтобы увидеть, какой из них работает. Вы выигрываете, когда персонажи больше не портятся. Я хотел бы ответить здесь, с программным примером. Но это, к сожалению, защищенный вопрос.
Брэндон Бертельсен
FF использует детекторы Mozilla Charset . Еще один простой способ - открыть файл с помощью MS word, он будет правильно угадывать файлы даже для различных древних китайских и японских
кодовых страниц
Если chardetили chardetectне доступно в вашей системе, вы можете установить пакет через менеджер пакетов (например, apt search chardet- на ubuntu / debian, обычно называемый пакетом python-chardetили python3-chardet), или через pip с pip install chardet(или pip install cchardetдля более быстрой версии c-optimized).
ccpizza

Ответы:

97

Файлы обычно указывают свою кодировку с заголовком файла. Есть много примеров здесь . Однако даже читая заголовок, вы никогда не можете быть уверены, какую кодировку файл действительно использует .

Например, файл с первыми тремя байтами 0xEF,0xBB,0xBF, вероятно , является файлом в кодировке UTF-8. Однако это может быть файл ISO-8859-1, который начинается с символов . Или это может быть совершенно другой тип файла.

Notepad ++ делает все возможное, чтобы угадать, какую кодировку использует файл, и в большинстве случаев он делает это правильно. Хотя иногда это не так - поэтому меню «Кодировка» есть, поэтому вы можете отменить его лучшее предположение.

Для двух кодировок вы упоминаете:

  • Файлы "Little Endian UCS-2" - это файлы UTF-16 (основанные на том, что я понимаю из информации здесь ), поэтому, вероятно, начнем с 0xFF,0xFEпервых 2 байтов. Из того, что я могу сказать, Notepad ++ описывает их как «UCS-2», поскольку он не поддерживает определенные аспекты UTF-16.
  • Файлы «UTF-8 без BOM» не имеют байтов заголовков. Вот что означает бит «без спецификации».
vaughandroid
источник
2
Почему файл, начинающийся с спецификации, автоматически определяется как «UTF-8 без спецификации»?
Майкл Боргвардт
2
И если файл начинается с 0xFF, 0xFE, он должен автоматически определяться как UTF-16, а не UCS-2. UCS-2, вероятно, угадан, потому что он содержит в основном символы ASCII и, следовательно, каждый второй байт равен нулю.
Майкл Боргвардт
2
С опытом, увы, метаданные («заголовки») также могут быть неправильными. База данных, содержащая информацию, может быть повреждена, или исходный загрузчик мог ошибиться. (Это было серьезной проблемой для нас в последние несколько месяцев; некоторые данные были загружены как «UTF-8», за исключением того, что это было «действительно ISO8859-1, так как они действительно одинаковые ?!») Бах! Ученые должны быть сохранены от происхождения метаданных, они просто ошибаются…)
Donal Fellows
1
На самом деле, я думаю, что это «забавно», что проблема кодирования все еще остается в 2014 году, поскольку ни один файл в мире не будет начинаться с «ï» ¿, и я очень удивляюсь, когда вижу страницу HTML, которая была загружена с неправильной кодировкой. Это вопрос вероятности. Невероятно выбрать неправильную кодировку, если другая кодировка позволит избежать странных символов .. Поиск кодировки, которая позволяет избежать странных символов, будет работать в 99,9999% случаев, я полагаю. Но все же есть ошибки. Также очень сбивает с толку сообщение использовать ascii вместо UTF8 для экономии места. Это сбивает с толку младших разработчиков.
Revious
18

Тебе нельзя. Если бы вы могли это сделать, не было бы так много веб-сайтов или текстовых файлов со «случайным бредом». Вот почему кодирование обычно отправляется вместе с полезной нагрузкой в ​​виде метаданных.

В противном случае все, что вы можете сделать, - это «умное предположение», но результат часто неоднозначен, поскольку одна и та же последовательность байтов может быть допустимой в нескольких кодировках.

Marco
источник
2
Хорошо, тогда хранит ли ОС Windows эту информацию (метаданные) где-то на самом деле? В реестре наверное?
Марсель
Ты не прав. Это кодовые страницы - не совсем то же самое. Существуют алгоритмы, позволяющие угадать кодировку Unicode.
DeadMG
6
@Marcel: Нет. Вот почему «текстовые файлы» так проблематичны для всего, кроме чистого ASCII.
Майкл Боргвардт
что ж, notepad ++ может это сделать, он может сказать вам, является ли текстовый файл в кодировке utf-8 или нет
user25