Им это не нужно , но рекомендуется предоставлять эту информацию, так как угадывание неправильной кодировки может
- в результате получается нечитаемая страница (только частично или полностью вся страница)
- ввести возможные уязвимости в систему
«Нет такого понятия, как обычный текст».
До появления Unicode компьютеры использовали различные кодовые страницы и схемы кодирования для записи различных сценариев. К сожалению, плохо в том, что в файл не встроена информация о кодировке. Эта ситуация не исчезнет, и различные наборы символов и кодировки будут продолжать существовать. Текстовый редактор должен открыть текстовый файл с соответствующей кодировкой, чтобы получить реальные кодовые точки, а затем отобразить его в правильной кодировке. Однако, поскольку они понятия не имеют, в какой кодировке находится файл, им приходится угадывать его с помощью эвристики.
Этот алгоритм обычно включает статистический анализ шаблонов байтов, таких как частотное распределение триграфов разных языков, закодированных в каждой кодовой странице, которая будет обнаружена; такой статистический анализ может также использоваться для определения языка.
https://en.wikipedia.org/wiki/Charset_detection
Firefox использует детекторы Mozilla Charset. Как это работает, объясняется здесь, и вы также можете изменить его эвристические предпочтения. Chrome ранее использовал детектор ICU, но переключился на CED почти 2 года назад
Большую часть времени они будут правильно угадывать кодировки, но алгоритмы работают лучше для слов, поэтому они могут потерпеть неудачу для многих символов. Кодировки Unicode, как правило, легче угадать благодаря способу кодирования UTF-8/16/32. Вы также можете форсировать кодировку, поместив спецификацию в начале.
Но в целом невозможно надежно угадать все кодировки и наборы символов, поскольку один и тот же поток байтов может быть действительным в нескольких кодировках одновременно. В конце концов, они могут совершать подобные ошибки, потому что в любом случае это просто угадывание! Именно так знаменитый Буш скрывал ошибку фактов, возникшую в блокноте до Vista, когда API IsTextUnicode
считает, что простой текстовый файл ASCII является файлом UTF-16LE, так как содержимое файла также выглядит нормально в UTF-16LE.
Плохое предположение также вводит уязвимость в систему, такую как эксплойт Google UTF-7 в ответе Дэвида. В результате кодировка всегда должна быть явно указана.
Хорошо, что большинство кодировок согласны друг с другом относительно первых 127 кодовых точек, поэтому браузеры могут просто считывать первые байты из заголовка с набором символов по умолчанию (или любым другим подходящим), пока не увидят опцию набора символов внутри meta
. Если кодировка была неправильной, то файл будет повторно открыт с использованием заданной кодировки в содержимом файла.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Прочитайте больше: