PHP на сервере Linux, PHP-FPM (версия уточняется)

PHP на сервере: После переноса сайта кириллица отображается неверно

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

После переноса сайта кириллица может стать нечитаемой из-за различий в кодировке исходных PHP-файлов, заголовка HTTP, соединения с базой или уже испорченных данных. Симптомы «ÐŸÑ€…» и «РџСЂ…» указывают на разные цепочки декодирования; менять все файлы «поиском и заменой» опасно.

В этой статье
  1. Что происходит и когда применима инструкция
  2. Причины и диагностические признаки
  3. Подробная пошаговая инструкция
  4. Как проверить, что проблема исправлена
  5. Если не помогло — дальнейшая диагностика и откат

#Что происходит и когда применима инструкция

После переноса сайта кириллица может стать нечитаемой из-за различий в кодировке исходных PHP-файлов, заголовка HTTP, соединения с базой или уже испорченных данных. Симптомы «ÐŸÑ€…» и «РџСЂ…» указывают на разные цепочки декодирования; менять все файлы «поиском и заменой» опасно.

#Причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
HTTP-заголовок или шаблон объявляет неверную кодировкуHTTP-заголовок или шаблон объявляет неверную кодировку. Браузер неверно показывает даже статический текст, но байты файла корректны.Браузер неверно показывает даже статический текст, но байты файла корректны.Согласовать Content-Type и meta charset.
Кодировка файлов отличается от ожидаемойКодировка файлов отличается от ожидаемой. Текст шаблона испорчен, а данные БД отображаются нормально.Текст шаблона испорчен, а данные БД отображаются нормально.Перевести файлы по копии, проверяя исходную кодировку.
Клиентское соединение БД или данные поврежденыКлиентское соединение БД или данные повреждены. Текст в БД корректен в одних клиентах, но искажён в приложении, либо испорчен уже в хранилище.Текст в БД корректен в одних клиентах, но искажён в приложении, либо испорчен уже в хранилище.Сравнить сырые данные и charset соединения.

#Подробная пошаговая инструкция

  1. Сделайте резервную копию файлов и базы до изменения кодировокОстановите автоматическую массовую перекодировку. Сохраните исходный дамп БД с информацией о кодировке и архив конкретных файлов. На тестовой копии выберите три контрольные строки: из статической страницы, PHP-шаблона и записи БД; запишите исходный текст и хеши.
  1. Определите, где впервые появляется искажениеВ браузере нажмите F12 → «Сеть» → основной документ → «Заголовки», найдите Content-Type и charset. Сравните с meta charset в HTML и фактическими байтами файла. Если UTF-8 указан правильно, но байты CP1251, смена только заголовка проблему не устранит.
  2. Терминал с curl, только чтение ответа, подставьте свой URL
    Linux · Терминал (Bash)Команда
    Терминал с curl, только чтение ответа, подставьте свой URL. Если сервер не обрабатывает HEAD как GET, проверьте заголовки обычного запроса через браузер.
    curl -sSI https://example.com/page | grep -i content-type
  1. Посмотрите кодировку одного исходного файлаВ Linux выполните file -bi над конкретным PHP-шаблоном, но учитывайте: определение кодировки утилитой приблизительно, а ASCII может быть частью разных кодировок. Откройте файл в редакторе с явным выбором кодировки, сравните отображение UTF-8 и Windows-1251 на копии.
    Linux · Терминал (Bash)Команда
    SSH, только чтение и пробное декодирование в /dev/null. Успешный iconv не доказывает, что весь файл был в CP1251; не перезаписывайте оригинал.
    file -bi /var/www/example/public/index.php; iconv -f WINDOWS-1251 -t UTF-8 /var/www/example/public/index.php >/dev/null
  1. Исправьте шаблоны на копии, не затрагивая двоичные файлыЕсли исходный текст действительно в Windows-1251, перекодируйте только выбранный текстовый PHP-файл в тестовую копию UTF-8, не меняя байты изображений, архивов, сессий и скрытых ключей. Проверьте BOM, синтаксис PHP, строки подключения и сохранение корректной русской страницы.
  1. Проверьте кодировку соединения БД и сохранённых данныхДля MySQL в приложении обычно используется корректный utf8mb4 в соединении. Проверьте charset таблиц и столбцов, а также пример записи через независимый клиент. Если данные уже были записаны неверными байтами, ALTER TABLE не восстановит оригинал и может повредить данные повторно.
  1. Согласуйте вывод UTF-8 на всех уровняхУстановите UTF-8 в HTTP Content-Type и HTML meta только после перевода контента; для PHP можно задать default_charset = UTF-8 в нужном окружении. Убедитесь, что программная обработка JSON, почты и PDF также сохраняет Unicode в соответствии со своим форматом.
  1. Сравните контролируемые строки после исправленияНа тестовом домене откройте три исходных текста, отправьте форму с русскими буквами, прочтите запись из БД и повторите после перезагрузки страницы. Затем перенесите строго проверенные изменения и храните архив для отката.

#Как проверить, что проблема исправлена

Статический текст, данные из БД и вновь введённая кириллица отображаются и сохраняются одинаково в UTF-8; исходные байты, не предназначенные для перекодировки, не изменены.

#Если не помогло — дальнейшая диагностика и откат

Если ошибка проявляется только в части старых записей, вероятно, в БД смешанные кодировки. Не запускайте общую конвертацию; ищите происхождение и исправляйте отдельно подтверждённые группы строк.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.