Сохраняют ли текстовые файлы свой метод кодирования для последующего декодирования?

19
  1. Мне было интересно, если некоторые текстовые файлы хранят свой метод кодирования вдоль их текстового содержимого для последующего декодирования?
  2. Или текстовый просмотрщик должен угадать метод кодирования для данного текстового файла, и угадывание не всегда может быть правильным? Если да, то как программа для просмотра текста догадывается об этом?
Тим
источник
Если это обычный текстовый файл, он ничего не хранит в кодировке. Я не могу сказать для богатого текста, хотя.
Вуфферс
Да, я говорю о незашифрованном тексте.
Тим

Ответы:

19

Мне было интересно, если некоторые текстовые файлы хранят свой метод кодирования вдоль их текстового содержимого для последующего декодирования?

Ответ Марка Шимански правильный: в явном текстовом файле нет явной информации о кодировке - это определение «простого текстового файла», под «обычным» понимается тот факт, что в файле нет метаданных.

Однако некоторые приложения размещают метку порядка байтов (BOM) в текстовых файлах, закодированных как UTF-16 или UTF-32 / UCS-4. На самом деле спецификация не предназначена для указания кодировки (она указывает порядок байтов, как следует из названия), но многие приложения будут использовать наличие спецификации для распознавания UTF-16 / UTF-32, поэтому она служит индикатором кодирования.

Или текстовый просмотрщик должен угадать метод кодирования для данного текстового файла, и угадывание не всегда может быть правильным? Если да, то как программа для просмотра текста догадывается об этом?

Да, просмотрщик текста может только догадываться. Обычно используется некоторая эвристика:

  • В некоторых кодировках (особенно в UTF-8) не все последовательности байтов являются действительными. Таким образом, приложение может просто попытаться декодировать файл как UTF-8. Если это успешно, файл вероятно UTF-8; если это не удается найти неправильную последовательность байтов, это не так. Вот как, например, vimработает по умолчанию: сначала он попытается использовать UTF-8 при чтении файла; если это не удается, он возвращается к ISO-8859-1.
  • В большинстве старых 8-битных кодировок допустима любая последовательность байтов. В этом случае иногда можно угадать кодировку, посмотрев на гистограмму байтов (частота различных байтов / последовательностей байтов). Internet Explorer делал это, чтобы «угадать» кодировку страницы. Тем не менее, это очень подвержено ошибкам, поэтому некоторые программы делают это.

В большинстве случаев программе необходимо явно указать кодировку текстового файла, иначе она не сможет правильно ее прочитать.

sleske
источник
Так как же file -biработает, если спецификация не используется?
Старый Geezer
@OldGeezer: fileимеет различные эвристики для определения типа файла и кодировки. В основном он ищет определенные строки или байтовые последовательности в файле. Если вам нужна более конкретная информация, вам, вероятно, придется прочитать источник. Или просто задайте отдельный вопрос :-).
слеске
@OldGeezer: И, кстати, fileне может надежно определить большинство текстовых кодировок (потому что это очень сложно). Страница man содержит некоторую информацию об обнаружении набора символов - в fileосновном распознает только ASCII, UTF-8/16, EBCDIC и ISO-8859-x. Например, файл, закодированный в KOI8-R, обозначается как «ISO-8859-1».
слеске
4

Обычные текстовые файлы не хранят никакой информации об их кодировке. Зритель определяет его на основе кодировки символов, которую вы для него установили. Он не может определить это сам по себе, так как это все равно для компьютера.

Wuffers
источник
Поэтому просмотрщики текста не могут различить методы кодирования для текстовых файлов. Если средство просмотра текста получает объект / исполняемый файл, сможет ли он сказать, что это не текстовый файл?
Тим
Нет, не может. Он попытается открыть его как текстовый файл. И, конечно, будет отображать кучу искаженных вещей. Единственный способ различить кодировки - это изменить кодировку вручную.
Вуфферс
@Tim: Большинство читателей текста используют эвристику, чтобы проверить, является ли что-то текстовым файлом. Если файл имеет много непечатаемых символов, многие зрители и редактора будут предупреждать (например , lessи grepна Unix / Linux это сделать).
Слеське