Почему после переноса сайта или загрузки базы вместо русского текста вопросы или непонятные символы — и как это исправить.
Почти всегда причина одна: часть сайта работает в одной кодировке, а часть — в другой. Сегодня везде должна быть UTF-8 (в MySQL она называется utf8mb4). Что именно не так, подскажет то, что вы видите.
Что видно на странице
- «????» вместо русских букв в текстах из базы. Буквы потерялись, когда текст сохраняли в базу или загружали её. Чаще всего базу загрузили не в той кодировке — загрузите её заново, как написано ниже.
- «РїСЂРёРІРµС‚» или «Ð¿Ñ€Ð¸Ð²ÐµÑ‚». Сами данные целы, но их читают не в той кодировке. Обычно сайт не сказал базе, в какой кодировке хочет получать текст.
- Чёрные ромбики с вопросом. Файлы сайта сохранены в старой кодировке windows-1251, а страница уверяет браузер, что она в UTF-8 (или наоборот).
Загрузка базы
В phpMyAdmin на вкладке Import есть поле «Character set of the file» — кодировка файла. Для современных выгрузок оставьте utf-8. Если файл старый, из времён windows-1251, выберите cp1251 — phpMyAdmin сам переведёт текст в нужную кодировку. Новые базы и таблицы создавайте в utf8mb4.
Сайт и база говорят на разных языках
Сайт должен сразу после подключения к базе сказать, что работает в UTF-8. В CMS это обычно настройка: в WordPress — строка define('DB_CHARSET', 'utf8mb4'); в wp-config.php. В своём коде на PHP:
// mysqli
mysqli_set_charset($link, 'utf8mb4');
// PDO
$pdo = new PDO('mysql:host=localhost;dbname=имя_базы;charset=utf8mb4', $user, $pass);
Кодировка страниц
В начале каждой страницы, в блоке <head>, должна стоять строка <meta charset="utf-8">. А сами файлы сайта — сохранены в UTF-8: в редакторе на компьютере это видно в строке состояния, там же кодировку можно сменить. Можно и подсказать браузеру на уровне всего сайта — строкой AddDefaultCharset UTF-8 в .htaccess.

