Согласно этой документации (я уверен, что среди многих других мест) очень важно объявить кодировку символов, используемую в данном файле для браузера.

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

Зачем браузерам эта информация, объявленная в файле?

Кажется, они довольно хорошо угадывают, когда кодировка не объявляется, но часто все же, кажется, не работают на "специальных" символах.

2 ответа2

2

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

  • в результате получается нечитаемая страница (только частично или полностью вся страница)
  • ввести возможные уязвимости в систему

«Нет такого понятия, как обычный текст».

До появления 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">

Прочитайте больше:

1

Ссылка UTF-8: секрет кодирования символов

Нет встроенной кодировки

Если это так, вы можете добавить соответствующий тег META на свой веб-сайт. Это так же просто, как скопировать фрагмент кода, приведенный выше, и заменить UTF-8 на любое имя mime вашей реальной кодировки.

Для всех этих скептиков существует очень веская причина, по которой кодировка символов должна быть явно указана. Когда браузеру не сообщают, что такое кодировка символов текста, он должен угадать: а иногда угадать неверно. Хакеры могут манипулировать этим предположением, чтобы пропустить XSS-фильтры и затем обмануть браузер, чтобы он выполнялся как активный код. Прекрасным примером этого является эксплойт Google UTF-7.

Возможно, вам не удастся не указывать кодировку символов с тегом META, если ваш веб-сервер отправляет правильный заголовок Content-Type, но зачем рисковать? Кроме того, если пользователь загружает файл HTML, веб-сервер больше не может определять кодировку символов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .