Это невозможно в общем случае. Если файл содержит точно
байты, которые я здесь печатаю, одинаково действительны как ASCII, UTF-8 или любой из
варианты ISO 8859. Несколько эвристик можно использовать как предположение,
однако: прочитайте первую «страницу» (512 байт или около того), затем, в следующем
заказ:
- Посмотрите, начинается ли блок с спецификации в одном из Unicode
форматы
- Посмотрите на первые четыре байта. Если они содержат `'\ 0'`, вы, вероятно,
имея дело с некоторой формой UTF-16 или UTF-32, в соответствии со следующим
шаблон:
'\0', <i>other</i>, '\0', <i>other</i>
UTF16BE
<i>other</i>, '\0', <i>other</i>, '\0'
UTF16LE
'\0', '\0', '\0', <i>other</i>
UTF32BE
<i>other</i>, '\0', '\0', '\0'
UTF32RLE
- Ищите байт с установленным старшим битом. Если это начало правовой
UTF-8 символ, то файл, вероятно, в UTF-8. В противном случае ... в
в регионах, где я работал, ISO 8859-1, как правило, лучший
думаю.
- В противном случае вы более или менее должны принимать ASCII, пока вы
встретить байт с установленным верхним битом (в этот момент вы используете
предыдущая эвристика).
Но, как я уже сказал, это не на 100% точно.
(PS. Как мне отформатировать таблицу здесь. Текст в пункте 2 объявлен как
HTML-таблица, но, похоже, она не отображается как единое целое.