Як виявити кодування файлу?


115

У моїй файловій системі (Windows 7) у мене є деякі текстові файли (це файли скриптів SQL, якщо це має значення).

При відкритті з Notepad ++ , в меню «Кодування» деякі з них , як повідомляється, кодування «UCS-2 Little Endian» і деякі «UTF-8 без BOM».

Яка тут різниця? Всі вони, здається, є абсолютно дійсними сценаріями. Як я можу сказати, які кодування мають цей файл без Notepad ++?


7
Існує досить простий спосіб використання Firefox. Відкрийте файл за допомогою Firefox, а потім Перегляд> Кодування символів. Детально тут .
— Кетрін Гасньє

використовувати евристику. каси encaта chardetдля POSIX систем.
— Янус Троельсен

3
Я думаю, що альтернативна відповідь - ТРІАЛ та ПОМИЛКА. iconvзокрема корисно для цієї мети. По суті, ви повторюєте пошкоджені рядки / текст символів через різні кодування, щоб побачити, який з них працює. Ви виграєте, коли персонажі більше не зіпсовані. Я б хотів відповісти тут, на прикладі програми. Але це, на жаль, захищене питання.
— Брендон Бертельсен

FF використовує Mozilla Charset Detectors . Ще один простий спосіб - це відкриття файлу за допомогою слова MS, воно вгадає файли цілком коректно навіть для різних давньокитайських та японських кодових сторінок
— phuclv

Якщо у вашій системі немає chardetабо chardetectнемає, то ви можете встановити пакунок через менеджер пакунків (наприклад, apt search chardetна ubuntu / debian пакет зазвичай викликається python-chardetабо python3-chardet) або через pip з pip install chardet(або pip install cchardetдля швидшої версії, оптимізованої c).
— ccpizza

Відповіді:


97

Файли зазвичай вказують на їх кодування заголовок файлу. Є багато прикладів тут . Однак, навіть читаючи заголовок, ви ніколи не можете бути впевнені, що кодує файл насправді .

Наприклад, файл із першими трьома байтами 0xEF,0xBB,0xBF, ймовірно, є кодованим файлом UTF-8. Однак це може бути файл ISO-8859-1, який починається з символів . Або це може бути цілком інший тип файлу.

Блокнот ++ робить все можливе, щоб здогадатися, що кодує файл, і більшу частину часу він отримує правильно. Іноді все-таки трапляється неправильно - ось чому це меню «Кодування» є, тож ви можете перекрити найкращі здогадки.

Для двох кодувань ви згадуєте:

  • Файли "UCS-2 Little Endian" - це файли UTF-16 (виходячи з того, що я розумію з інформації тут ), тому, ймовірно, починаються з 0xFF,0xFEперших 2 байтів. З того, що я можу сказати, Notepad ++ описує їх як "UCS-2", оскільки він не підтримує певні аспекти UTF-16.
  • У файлах "UTF-8 без BOM" немає байтів заголовка. Ось що означає біт "без BOM".


2
Чому файл, який починається з BOM, автоматично визначається як "UTF-8 без BOM"?
— Майкл Боргвардт

2
І якщо файл починався з 0xFF, 0xFE, він повинен бути автоматично виявлений як UTF-16, а не UCS-2. UCS-2, мабуть, здогадується, оскільки він містить в основному символи ASCII, тому кожен байт є недійсним.
— Майкл Боргвардт

2
З досвідом, на жаль, метадані ("заголовки") також можуть помилятися. База даних, що містить інформацію, може бути пошкоджена, або оригінал завантажувача міг помилитися з цим. (Це була суттєва проблема для нас протягом останніх кількох місяців; деякі дані були завантажені як "UTF-8", за винятком того, що це "справді ISO8859-1, оскільки вони насправді такі самі ?!" Ба! Вчені повинні зберігати далеко від виникнення метаданих; вони просто помиляються…)
— стипендіати

1
Насправді я думаю, що "смішно", що проблема кодування залишається у 2014 році, оскільки жоден файл у світі не починається з "ï» ¿", і я дуже здивований, коли бачу HTML-сторінку, завантажену неправильним кодуванням. Це питання ймовірності. Немислимо вибрати неправильне кодування, якщо інше кодування уникне дивних символів. Шукаючи кодування, яке дозволяє уникнути дивних символів, працювало б у 99,9999% випадків. Але все ж є помилки .. Також дуже заплутане повідомлення використовувати ascii замість UTF8, щоб заощадити простір .. це заплутує молодших розробників цю ідею виконувати ..
— Revious

18

Ти не можеш. Якби ви могли це зробити, там не було б так багато веб-сайтів або текстових файлів із "випадковим гнутом". Ось чому кодування зазвичай надсилається разом із корисним навантаженням як метадані.

Якщо це не так, все, що ви можете зробити, - це "розумна здогадка", але результат часто неоднозначний, оскільки одна і та ж послідовність байтів може бути дійсною в декількох кодуваннях.


2
Гаразд, чи ОС Windows зберігає таку інформацію (метадані) десь? У реєстрі, напевно?
— Марсель

Ви помиляєтеся. Це кодові сторінки - не зовсім те саме. Існують алгоритми вгадування при кодуванні Unicode.
— DeadMG

6
@Marcel: Ні. Тому "текстові файли" настільки проблематичні ні для чого, крім чистого ASCII.
— Майкл Боргвардт

ну блокнот ++ може це зробити, він може сказати вам, чи текстовий файл закодовано utf-8 чи ні
— користувач25
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.