Кодировка — это набор правил‚ определяющих соответствие между визуальными символами (буквами‚ цифрами‚ знаками препинания и т.д.) и их представлением в виде последовательности байтов в памяти компьютера или в файле. Разные кодировки могут использовать различное количество байтов на один символ.
Основные исторические кодировки
- ASCII (American Standard Code for Information Interchange) – 7‑битная таблица‚ содержащая (латинские буквы верхнего и нижнего регистра‚ цифры‚ знаки препинания‚ управляющие коды).
- ISO‑8859‑1 (Latin‑1) – расширение ASCII до 8 бит‚ добавляет символы для западноевропейских языков.
- Windows‑1251 – 8‑битная кодировка‚ используемая в Windows для кириллицы.
- CP‑866 – альтернативная 8‑битная кодировка кириллицы‚ распространённая в DOS.
- KOI‑8R – ещё одна 8‑битная кодировка кириллицы‚ где буквы расположены по порядку латинских кодов.
- ISO‑8859‑5 – 8‑битная кодировка для кириллицы‚ используемая в некоторых Unix‑системах.
Все перечисленные выше кодировки являются однобайтовыми: каждый символ представлен ровно одним байтом (0‑255). Это ограничивает набор доступных символов 256 значениями‚ что недостаточно для поддержки всех мировых письменностей.
Unicode и UTF‑8
Для решения проблемы ограниченного набора символов был создан Unicode — универсальный стандарт‚ присваивающий уникальный номер (кодовую точку) каждому известному символу. На сегодняшний день Unicode охватывает более 140 .
Unicode сам по себе не указывает‚ как хранить эти кодовые точки в памяти. Для этого существуют различные формы преобразования‚ называемые UTF (Unicode Transformation Format). Наиболее распространённая из них, UTF‑8.
Как работает UTF‑8?
UTF‑8 — переменно‑длинная кодировка:
- Символы из диапазона U+0000–U+007F (то есть обычный ASCII) кодируются одним байтом‚ cuyas биты совпадают с кодом ASCII. Это обеспечивает полную обратную совместимость с ASCII.
- Символы U+0080–U+07FF кодируются двумя байтами. Первый байт начинается с паттерна
110xxxxx‚ второй — с10xxxxxx. - Символы U+0800–U+FFFF кодируются тремя байтами (паттерны
1110xxxx10xxxxxx10xxxxxx). - Символы U+10000–U+10FFFF кодируются четырьмя байтами (паттерны
11110xxx10xxxxxx10xxxxxx10xxxxxx).
Таким образом‚ английский текст и числа занимают столько же места‚ что и в чистом ASCII‚ а символы других алфавитов (кириллица‚ греческий‚ китайский и т.д.) используют два‚ три или четыре байта.
Преимущества UTF‑8
- Обратная совместимость с ASCII.
- Экономия места для текстов‚ predominately латинских.
- Поддержка всего набора Unicode.
- Широко поддерживается веб‑браузерами‚ серверами‚ базами данных и языками программирования.
<meta charset="UTF-8"> Этот тег следует размещать как можно ближе к началу <head>‚ ideally сразу после открывающего тега <head>. Тогда браузер получит информацию о кодировке до того‚ как начнёт парсить любой контент страницы.
Практические примеры
Ниже показано‚ как одна и та же фраза «Привет» выглядит в различных однобайтовых кодировках и в UTF‑8.
- Windows‑1251: байты
CF F0 E8 E2 E5 F2 - CP‑866: байты
E2 F0 E8 E2 E5 F2 - KOI‑8R: байты
F0 E2 E5 E2 F2 F0 - ISO‑8859‑5: байты
D0 F0 E8 E2 E5 F2 - UTF‑8: байты
D0 9F D1 80 D0 B8 D0 B2 D0 D5 D1 82
Обратите внимание‚ что в UTF‑8 каждый кириллический символ занимает два байта‚ тогда как в однобайтовых кодировках — один.
Типичные проблемы и способы их избежать
«Кракозябры» из‑за неверной кодировки
Если браузер считает‚ что документ в одной кодировке‚ а на самом деле он сохранён в другой‚ пользователь увидит бессмысленные символы. Например‚ файл‚ сохранённый в Windows‑1251‚ но объявленный как UTF‑8‚ покажет вместо «Привет» что‑то вроде Привет.
Как избежать:
- Всегда сохраняйте исходные файлы в той кодировке‚ которую указываете в мета‑теге.
- При работе с редакторами проверяйте статусную строку: большинство IDE показывают текущую кодировку файла.
- Если нужно перекодировать файл‚ используйте проверенные инструменты (например‚
iconvили встроенные функции редактора).
Смешивание кодировок в одном документе
Иногда разработчики вставляют фрагменты текста‚ полученные из внешних источников (базы данных‚ API)‚ которые могут быть в другой кодировке. Это приводит к частичному отображению кракозябр.
Как избежать:
- При получении данных явно указывайте требуемую кодировку (например‚ при подключении к MySQL:
SET NAMES utf8mb4). - Преобразуйте входящие данные в UTF‑8 сразу после получения.
- Весь стек (файлы‚ база данных‚ сервер‚ клиент) должен работать в одной и той же кодировке — предпочтительно UTF‑8.
Отсутствие BOM и неправильное определение кодировки
Некоторые редакторы добавляют в начало файла байтовый порядковый маркер (BOM). В UTF‑8 BOM не обязателен и может вызывать проблемы у старых скриптов‚ которые не ожидают его наличия.
Рекомендация: Для веб‑страниц лучше не использовать BOM в UTF‑8 файлах. Если вы всё же встретили файл с BOM‚ убедитесь‚ что ваш сервер или скрипт корректно его обрабатывает (обычно достаточно игнорировать первые три байта).
Понимание кодировок — фундаментальный навык любого разработчика. Выбор UTF‑8 в качестве стандартной кодировки для веб‑проектов значительно упрощает работу с многоязычным контентом и минимизирует риски возникновения ошибок отображения. Помните:
- Сохраняйте исходные файлы в той же кодировке‚ что и объявленную.
- При работе с внешними данными явно задавайте и преобразуйте кодировку в UTF‑8.
- Тестируйте отображение страниц в разных браузерах и на разных операционных системах‚ чтобы убедиться‚ что текст выглядит корректно.
Следуя этим простым правилам‚ вы избавите себя от большинства проблем с «кракозябрами» и сможете сосредоточиться на создании качественного контента.