#Что происходит и когда применима инструкция
После переноса сайта кириллица может стать нечитаемой из-за различий в кодировке исходных PHP-файлов, заголовка HTTP, соединения с базой или уже испорченных данных. Симптомы «ÐŸÑ€…» и «РџСЂ…» указывают на разные цепочки декодирования; менять все файлы «поиском и заменой» опасно.
#Причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| HTTP-заголовок или шаблон объявляет неверную кодировкуHTTP-заголовок или шаблон объявляет неверную кодировку. Браузер неверно показывает даже статический текст, но байты файла корректны. | Браузер неверно показывает даже статический текст, но байты файла корректны. | Согласовать Content-Type и meta charset. |
| Кодировка файлов отличается от ожидаемойКодировка файлов отличается от ожидаемой. Текст шаблона испорчен, а данные БД отображаются нормально. | Текст шаблона испорчен, а данные БД отображаются нормально. | Перевести файлы по копии, проверяя исходную кодировку. |
| Клиентское соединение БД или данные поврежденыКлиентское соединение БД или данные повреждены. Текст в БД корректен в одних клиентах, но искажён в приложении, либо испорчен уже в хранилище. | Текст в БД корректен в одних клиентах, но искажён в приложении, либо испорчен уже в хранилище. | Сравнить сырые данные и charset соединения. |
#Подробная пошаговая инструкция
- Сделайте резервную копию файлов и базы до изменения кодировокОстановите автоматическую массовую перекодировку. Сохраните исходный дамп БД с информацией о кодировке и архив конкретных файлов. На тестовой копии выберите три контрольные строки: из статической страницы, PHP-шаблона и записи БД; запишите исходный текст и хеши.
- Определите, где впервые появляется искажениеВ браузере нажмите F12 → «Сеть» → основной документ → «Заголовки», найдите Content-Type и charset. Сравните с meta charset в HTML и фактическими байтами файла. Если UTF-8 указан правильно, но байты CP1251, смена только заголовка проблему не устранит.
- Терминал с curl, только чтение ответа, подставьте свой URLLinux · Терминал (Bash)КомандаТерминал с curl, только чтение ответа, подставьте свой URL. Если сервер не обрабатывает HEAD как GET, проверьте заголовки обычного запроса через браузер.
curl -sSI https://example.com/page | grep -i content-type
- Посмотрите кодировку одного исходного файлаВ 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
- Исправьте шаблоны на копии, не затрагивая двоичные файлыЕсли исходный текст действительно в Windows-1251, перекодируйте только выбранный текстовый PHP-файл в тестовую копию UTF-8, не меняя байты изображений, архивов, сессий и скрытых ключей. Проверьте BOM, синтаксис PHP, строки подключения и сохранение корректной русской страницы.
- Проверьте кодировку соединения БД и сохранённых данныхДля MySQL в приложении обычно используется корректный utf8mb4 в соединении. Проверьте charset таблиц и столбцов, а также пример записи через независимый клиент. Если данные уже были записаны неверными байтами, ALTER TABLE не восстановит оригинал и может повредить данные повторно.
- Согласуйте вывод UTF-8 на всех уровняхУстановите UTF-8 в HTTP Content-Type и HTML meta только после перевода контента; для PHP можно задать default_charset = UTF-8 в нужном окружении. Убедитесь, что программная обработка JSON, почты и PDF также сохраняет Unicode в соответствии со своим форматом.
- Сравните контролируемые строки после исправленияНа тестовом домене откройте три исходных текста, отправьте форму с русскими буквами, прочтите запись из БД и повторите после перезагрузки страницы. Затем перенесите строго проверенные изменения и храните архив для отката.
#Как проверить, что проблема исправлена
Статический текст, данные из БД и вновь введённая кириллица отображаются и сохраняются одинаково в UTF-8; исходные байты, не предназначенные для перекодировки, не изменены.
#Если не помогло — дальнейшая диагностика и откат
Если ошибка проявляется только в части старых записей, вероятно, в БД смешанные кодировки. Не запускайте общую конвертацию; ищите происхождение и исправляйте отдельно подтверждённые группы строк.