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


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.