Як я бачу, яке кодування використовується у файлі


23

У мене були деякі проблеми з файлами субтитрів у відео omxplayer. Щоб вирішити це, мені довелося перетворити з кодування Windows-1250 в кодування UTF-8. Моє запитання: як я можу побачити якийсь конкретний файл, кодування якого використовується?


piconvзмінити кодування;)
Rinzwind

Так. Я вже змінив кодування (в 1 файлі). Але у мене є багато таких, і я хотів зробити невеликий сценарій, який би контролював їх усі, а потім приховував, якщо потрібно. Але я гадаю, що я можу просто перетворити їх усіх. Шкоди не буде, якщо деякі вже є в UTF-8. Правильно?
NonStandardModel

Не проблема немає :) Просто використовуйте підстановку
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, який я написав для цієї відповіді тут , який сканує повні файли та намагається їх розшифрувати за допомогою визначеного набору символів. Якщо це вдасться, кодування є потенційним кандидатом. В іншому випадку, якщо є будь-які байти, які неможливо розшифрувати за допомогою нього, ви можете видалити цей набір символів зі свого списку.


ANSI насправді не є ім'ям кодування будь-яких символів. Можливо, ви думаєте про ANSI-коди втечі, які можна виразити кодуванням символів ASCII.
kasperd

@kasperd Швидше за все, він посилається на одну з сімейств кодових сторінок ISO 8859 або Window. Для розробників Windows в Північній Америці кодування ANSI часто означає кодування Windows 1252 з історичних причин.
користувач1937198

Так, 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, в результаті чого "š" і "ß" були зашифровані.
Марк

Чудово 👌! Витратив кілька годин, щоб знайти правильне кодування мого старого .sqlфайлу і fileпоказав, що це дійсно gzipстислий файл!
Амірреза Насірі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.