Как я могу увидеть, какая кодировка используется в файле

23

У меня были некоторые проблемы с файлами субтитров в видео omxplayer. Чтобы решить эту проблему, мне пришлось преобразовать Windows-1250 в кодировку UTF-8. У меня вопрос, как я могу увидеть для определенного файла, какая кодировка используется?

NonStandardModel
источник
piconvсменить кодировку;)
Rinzwind
Да. Я уже изменил кодировку (в 1 файле). Но у меня их много, и я хотел сделать небольшой скрипт, который бы контролировал их все, а затем скрывал при необходимости. Но я полагаю, что я могу просто преобразовать их всех. Никакого вреда не будет, если некоторые уже находятся в UTF-8. Правильно?
Нестандартная модель
Нет проблем нет :) Просто используйте подстановочный знак
Rinzwind

Ответы:

26

Вы не можете автоматически определить, был ли файл изначально написан с кодировкой X.

Однако вы можете легко проверить, можно ли каким-то образом успешно декодировать весь файл (но не обязательно правильно), используя определенный кодек. Если вы найдете какие-либо байты, которые недопустимы для данной кодировки, это должно быть что-то еще.

Проблема в том, что многие кодеки похожи и имеют одинаковые «допустимые шаблоны байтов», просто интерпретируя их как разные символы. Например, äкодирование в одном может соответствовать éдругому или øв третьем. Компьютер не может действительно определить, какой способ интерпретации байта приводит к правильно читаемому человеку тексту (если, возможно, если вы добавите словарь для всех видов языков и позволите ему выполнять проверку орфографии ...). Вы также должны знать, что некоторые наборы символов фактически являются подмножествами других, например, кодировка ASCII является частью наиболее часто используемых кодеков, таких как некоторые из семейства ANSI или UTF-8. Это означает, например, текст, сохраненный как UTF-8, который содержит только простые латинские символы, он будет идентичен тому же файлу, сохраненному как ASCII.


Однако давайте вернемся к объяснению того, что вы не можете сделать, к тому, что вы действительно можете сделать:

Для базовой проверки текстовых файлов ASCII / non-ASCII (обычно UTF-8) вы можете использовать fileкоманду. Однако он не знает многих кодеков и проверяет только первые несколько килобайт файла, предполагая, что остальные не будут содержать никаких новых символов. С другой стороны, он также распознает другие распространенные типы файлов, такие как различные сценарии, документы HTML / XML и многие форматы двоичных данных (хотя все это неинтересно для сравнения текстовых файлов), и может выводить дополнительную информацию, если есть чрезвычайно длинные строки или что тип последовательности новой строки (например, UNIX: LF, Windows: CR + LF).

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

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

Byte Commander
источник
ANSI на самом деле не является названием какой-либо кодировки символов. Возможно, вы думаете о escape-кодах ANSI, которые можно выразить с помощью кодировки символов ASCII.
Каспер
@kasperd Скорее всего, он ссылается на одно из семейств кодовых страниц ISO 8859 или Window. Для североамериканских разработчиков Windows кодировка ANSI часто означает кодировку Windows 1252 по историческим причинам.
user1937198
Да, хорошо, ANSI в основном ASCII (коды 0-127) плюс кодовая страница, специфичная для локали (коды 128-255). Итак, вы правы ...
Байт-командир
Больше информации: что такое формат ANSI?
wjandrea
12

Программа с именем fileможет сделать это. Пример:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

Если вы заинтересованы в том, как это делается, смотрите src/encoding.c.

Аркадиуш Драбчик
источник
2
Это может угадать , в любом случае.
Хоббс
2
fileделает предположение, и часто это не очень хорошо. Например, в моем тестировании он ошибочно идентифицировал MacRoman и CP-1252 как ISO-8859, в результате чего «š» и «ß» были зашифрованы.
Mark
Отлично 👌! Потратил несколько часов, чтобы найти правильную кодировку моего старого .sqlфайла и fileпоказал, что это действительно gzipсжатый файл!
Амирреза Насири