Элемент <head>. Кодировка символов

Автор: Евгений Рыжков и Татьяна Головко Дата публикации: 12.03.2011

Первым дочерним элементом для корневого обычно является <head>. Элемент <head> содержит метаданные — информацию о странице, а не содержимое самой страницы (содержимое страницы заключено в элемент <body>). Сам <head> довольно скучный элемент и в HTML5 он почти не изменился. Полезные изменения коснулись содержимого этого элемента. Рассмотрим следующий код:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>My Weblog</title>
<link rel="stylesheet" type="text/css" href="style-original.css" />
<link rel="alternate" type="application/atom+xml"
title="My Weblog feed"
href="/feed/" />
<link rel="search" type="application/opensearchdescription+xml"
title="My Weblog search"
href="opensearch.xml" />
<link rel="shortcut icon" href="/favicon.ico" />
</head>

Сначала элемент <meta>:

Кодировка символов

Когда мы говорим «текст», то чаще всего представляем его как набор символов на экране монитора. Но компьютеры не имеют дела с символами, они работают с битами и байтами. Любой кусок текста, представленный на экране хранится в виде символьной кодировки. Существует множество кодировок. Одни оптимизированы под конкретные языки (например, русский, китайский, английский), другие — сразу для нескольких языков. Грубо говоря, кодировка обеспечивает соответствие того, что ты видишь на экране, с тем, что хранится в памяти компьютера.

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

Итак, как же браузер определяет, в какой кодировке пришла ему последовательность байт? Я рад, что ты задал этот вопрос. Если ты знаком с HTTP заголовками, то ты уже встречал что-то типа этого:

Content-Type: text/html; charset="utf-8"

Если кратко, то таким заголовком сервер сообщает, что он отправил HTML документ, в котором используется кодировка utf-8. К сожалению или к радости, но немногие авторы имеют доступ к своим HTTP серверам. Например, Blogger: контент пишут миллионы отдельных лиц, а сервера принадлежат Google. Поэтому разработчики HTML4 приняли решение, что HTML документ будет содержать информацию о кодировке непосредственно внутри себя. Наверное, такая строка тебе знакома:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Такой код говорит, что автор считает, что содержимое его документа использует кодировку utf-8.

Оба метода все еще работают. HTTP-заголовок является более предпочтительным, он перекрывает мата тег. Но не каждый может установить HTTP-заголовок, поэтому мета тег все еще жив. В HTML5 он просто стал короче:

<meta charset="utf-8" />

Это работает во всех браузерах.

Да, кстати, кавычки не обязательны:

<meta charset=utf-8 />

Браузеры давно уже привыкли к игнорированию авторами кавычек в мета тегах.

В: Я никогда не использую необычные символы, вроде смайлов. Обязательно ли мне указывать кодировку?

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

Подведем итог: кодировки — это сложно. И это не было реализовано просто из-за многих поколений плохо написанного кода. Ты всегда должен указывать кодировку на всех своих HTML страницах иначе можно нарваться на неприятности. Задашь ты ее с указанием Content-Type или воспользуешься более короткой записью — решать тебе. Но обязательно укажи кодировку. Веб будет тебе благодарен.

Куда дальше