Если вместо текста на сайте вылезают кракозябры или вопросительные знаки, дело почти всегда в рассогласовании кодировок: страница объявляет одну кодировку, а файл, сервер или база данных отдают данные в другой. Чтобы исправить, нужно привести к UTF-8 все звенья цепочки — исходные файлы, HTTP-заголовки, HTML-мету и таблицы БД, а не что-то одно.
Как найти, в каком звене сбилась кодировка
Проверять нужно по порядку, потому что кракозябры на экране выглядят одинаково при разных причинах.
- Откройте исходный код страницы и посмотрите, что указано в <meta charset=»»> в начале <head> — тег должен идти одним из первых элементов, до любых скриптов и стилей.
- В инструментах разработчика (вкладка Network) посмотрите заголовок ответа Content-Type — там должно быть charset=utf-8, а не windows-1251 или его отсутствие.
- Откройте сам файл шаблона в редакторе кода и проверьте, в какой кодировке он реально сохранён — часто верстальщик один раз сохранил файл в Windows-1251, и с этого момента все правки в нём наследуют старую кодировку.
- Если кракозябры появляются только в данных из базы (текст статей, комментарии), проверьте кодировку таблиц в phpMyAdmin — нередко таблица создана в latin1 или в старом utf8 (не utf8mb4), а движок работает с новыми данными в utf8mb4.
Как привести кодировку к единому стандарту
После того как найдено слабое звено, кодировку меняют сразу на всех уровнях, иначе проблема вылезет в другом месте.
- В HTML пропишите <meta charset=»UTF-8″> первой строкой внутри <head>.
- На сервере (Apache) добавьте в .htaccess строку AddDefaultCharset UTF-8, а в PHP — явный заголовок header(‘Content-Type: text/html; charset=utf-8’); перед выводом любого текста.
- Пересохраните все файлы шаблона в редакторе в формате UTF-8 без BOM — большинство редакторов (VS Code, Notepad++) позволяют выбрать кодировку сохранения в нижней панели.
- Для базы данных выполните конвертацию таблиц в utf8mb4 и укажите ту же кодировку соединения в коде подключения (SET NAMES utf8mb4 или соответствующий параметр в конфиге CMS).
Что делать, если кракозябры остались после всех правок
Если после исправлений текст всё ещё ломается, вероятны две типовые причины.
- Двойное перекодирование — данные, уже сохранённые как UTF-8, повторно конвертируют функцией вроде utf8_encode, из-за чего русские буквы превращаются в наборы символов вида «Ð ÑƒÑ…». В этом случае нужно убрать лишнюю конвертацию, а не добавлять новую.
- Кэш — браузер, CDN или плагин кэширования отдают старую версию страницы со старыми заголовками. Сбросьте кэш сайта и жёстко обновите страницу в браузере (Ctrl+F5), прежде чем делать выводы о том, помогла ли правка.
Если BOM (метка порядка байтов) случайно попал в начало PHP-файла с настройками, это тоже ломает кодировку вывода — при пересохранении файла в UTF-8 явно выбирайте вариант «без BOM».