Почему на сайте не работает кодировка UTF-8 и как это исправить

Если вместо текста на сайте вылезают кракозябры или вопросительные знаки, дело почти всегда в рассогласовании кодировок: страница объявляет одну кодировку, а файл, сервер или база данных отдают данные в другой. Чтобы исправить, нужно привести к 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».

Понравилась статья? Поделиться с друзьями: