У меня были некоторые проблемы с файлами субтитров в видео omxplayer. Чтобы решить эту проблему, мне пришлось преобразовать Windows-1250 в кодировку UTF-8. У меня вопрос, как я могу увидеть для определенного файла, какая кодировка используется?
У меня были некоторые проблемы с файлами субтитров в видео omxplayer. Чтобы решить эту проблему, мне пришлось преобразовать Windows-1250 в кодировку UTF-8. У меня вопрос, как я могу увидеть для определенного файла, какая кодировка используется?
Ответы:
Вы не можете автоматически определить, был ли файл изначально написан с кодировкой 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, который я написал для этого ответа , который сканирует полные файлы и пытается декодировать их, используя указанный набор символов. Если это удастся, это кодирование является потенциальным кандидатом. В противном случае, если есть какие-либо байты, которые не могут быть декодированы вместе с ним, вы можете удалить этот набор символов из своего списка.
Программа с именем 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
.
file
делает предположение, и часто это не очень хорошо. Например, в моем тестировании он ошибочно идентифицировал MacRoman и CP-1252 как ISO-8859, в результате чего «š» и «ß» были зашифрованы.
.sql
файла и file
показал, что это действительно gzip
сжатый файл!
piconv
сменить кодировку;)