У меня были некоторые проблемы с файлами субтитров в видео omxplayer. Чтобы решить эту проблему, мне пришлось преобразовать Windows-1250 в кодировку UTF-8. У меня вопрос, как я могу увидеть для определенного файла, какая кодировка используется?
23
piconv
сменить кодировку;)Ответы:
Вы не можете автоматически определить, был ли файл изначально написан с кодировкой X.
Однако вы можете легко проверить, можно ли каким-то образом успешно декодировать весь файл (но не обязательно правильно), используя определенный кодек. Если вы найдете какие-либо байты, которые недопустимы для данной кодировки, это должно быть что-то еще.
Проблема в том, что многие кодеки похожи и имеют одинаковые «допустимые шаблоны байтов», просто интерпретируя их как разные символы. Например,
ä
кодирование в одном может соответствоватьé
другому илиø
в третьем. Компьютер не может действительно определить, какой способ интерпретации байта приводит к правильно читаемому человеку тексту (если, возможно, если вы добавите словарь для всех видов языков и позволите ему выполнять проверку орфографии ...). Вы также должны знать, что некоторые наборы символов фактически являются подмножествами других, например, кодировка ASCII является частью наиболее часто используемых кодеков, таких как некоторые из семейства ANSI или UTF-8. Это означает, например, текст, сохраненный как UTF-8, который содержит только простые латинские символы, он будет идентичен тому же файлу, сохраненному как ASCII.Однако давайте вернемся к объяснению того, что вы не можете сделать, к тому, что вы действительно можете сделать:
Для базовой проверки текстовых файлов ASCII / non-ASCII (обычно UTF-8) вы можете использовать
file
команду. Однако он не знает многих кодеков и проверяет только первые несколько килобайт файла, предполагая, что остальные не будут содержать никаких новых символов. С другой стороны, он также распознает другие распространенные типы файлов, такие как различные сценарии, документы HTML / XML и многие форматы двоичных данных (хотя все это неинтересно для сравнения текстовых файлов), и может выводить дополнительную информацию, если есть чрезвычайно длинные строки или что тип последовательности новой строки (например, UNIX: LF, Windows: CR + LF).Если этого недостаточно, я могу предложить вам скрипт Python, который я написал для этого ответа , который сканирует полные файлы и пытается декодировать их, используя указанный набор символов. Если это удастся, это кодирование является потенциальным кандидатом. В противном случае, если есть какие-либо байты, которые не могут быть декодированы вместе с ним, вы можете удалить этот набор символов из своего списка.
источник
Программа с именем
file
может сделать это. Пример:Если вы заинтересованы в том, как это делается, смотрите
src/encoding.c
.источник
file
делает предположение, и часто это не очень хорошо. Например, в моем тестировании он ошибочно идентифицировал MacRoman и CP-1252 как ISO-8859, в результате чего «š» и «ß» были зашифрованы..sql
файла иfile
показал, что это действительноgzip
сжатый файл!