У мене були деякі проблеми з файлами субтитрів у відео 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
змінити кодування;)