Кракозябры вместо русских букв на сайте — 6 проблем и их решения

Когда я только начинал изучать тему разработки сайтов, кракозябры были одной из моих постоянных проблем. Создал HTML-страницу — в браузере кракозябры, установил денвер и попробовал создать сайт на PHP — снова вместо букв кракозябры. Скачал иностранную тему, подключился к базе данных — та же проблема.

На своих сайтах я обычно использую UTF-8 (это такая кодировка текста, она ещё называется юникод), соответственно она будет присутствовать во всех примерах в этой статье.

1. UTF-8 без BOM

Начнём с самой простой проблемы. Вы создали какой-то HTML-файл, открыли его в браузере и получили:

Проблема с кодировкой (кракозябры)
Кракозябры (проблема с кодировкой).

Проблема актуальна в основном для пользователей Windows, на маке я с таким ни разу не сталкивался.

Решение проблемы зависит в основном от того, каким редактором вы пользуетесь. Для пользователей Windows я рекомендую бесплатный офигительный Notepad++.

Значит, открываем файл в Notepad++ и переходим в Кодировки > Преобразовать в UTF-8 без BOM. Вопрос — почему без BOM? Потому что с BOM у вас будут постоянно вставляться пустые символы (на самом деле они не пустые, у них тоже есть своя функция, но нам она в данном случае не нужна) куда не надо, а для PHP это уже критично.

Notepad++ преобразовать в utf8 без BOM

2. Мета тег charset

Если вы сделали то, что я описывал в предыдущем шаге и ваша проблема не разрешилась, тогда самое время испробовать второй метод устранения кракозябров.

Всё, что нам требуется, это вставить следующий код между тегами <head> сайта. Прежде всего проверьте, возможно этот метатег у вас уже присутствует. Если да, то посмотрите какое у него стоит значение параметра charset.

<meta charset="UTF-8" />

В темах WordPress обычно этот тег уже имеется по умолчанию и выглядит следующим образом:

<meta charset="<?php bloginfo('charset'); ?>" />

3. .htaccess

Если русские буквы до сих пор отображаются кракозябрами, тогда открываем ваш .htaccess, который лежит в корне сайта и вставляем туда с новой строки это:

AddDefaultCharset utf-8

4. Заголовки сервера через header()

Ещё один способ определения кодировки. На этот раз через PHP. На WordPress никогда не приходилось им пользоваться.

header('Content-Type: text/html; charset=utf-8');

Важно! Этот код должен вставляться до того, как будет что-либо выведено на странице сайта, иначе — ошибка.

5. Проблемы с последним символом при обрезке строки

На многих сайтах встречаются блоки с популярными записями, последними комментариями, отзывами и так далее. Обычно в таких обзорных блоках выводится часть записи/комментария/отзыва и кнопка «читать далее». Так вот, для того, чтобы вывести первые несколько предложений или первые несколько слов текста, используется функция PHP substr(). Конечно же в основном я имею ввиду англоязычные темы, которых так много в интернете. Даже если у этих тем есть локализация — то есть вроде бы она на русском — переведена админка, переведён практически весь сайт, но при этом мы встречаем такие вот косяки:

Проблема с кодировкой функции substr()

Как решить эту проблему?

Легко — всё что нам нужно, это найти функцию substr() в коде и поменять её на mb_substr().

Если после этого у вас полезут ошибки на сайт, то скорее всего multibyte-функции не поддерживаются вашим хостингом, первое, что вам следует сделать, это написать в супорт и спросить, нельзя ли их подключить на ваш аккаунт. Если нет, меняем хостинг, например на тот, которым пользуюсь я.

6. MySQL

У меня не раз бывало такое, что я подключался к MySQL, вытаскивал какие-нибудь данные, и при их выводе на сайте, текст отображался кракозябрами.

Такое может произойти, если кодировка вашего сайта не совпадает с кодировкой базы данных, к которой вы подключаетесь. В WordPress обычно таких проблем не бывает.

Для того, чтобы исправить это, после подключения к БД, делаем следующее:

mysql_query("SET NAMES 'UTF8'");

Если ни один из вышеперечисленных методов вам не помог, оставляйте комментарий и попробуем вместе разобраться.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 38

  • NextGenGamer20 марта 2015 в 16:03 #

    Спасибо! статья помогла мне.

  • Василий16 июня 2015 в 20:06 #

    Спасибо помогло писал код в PHPDesigner проблему решил по умолчанию файл был создан в кодировке ANSI поменял на UTF-8 без BOM (Проблема в списке 1) заработало.

  • Daria28 июня 2015 в 18:06 #

    Благодарю! Использовала .htaccess

  • User1 августа 2015 в 21:08 #

    Спасибо за подсказку насчет "Кодировки > Преобразовать в UTF-8 без BOM". Никак не мог понять откуда берутся пустые символы.

  • campusboy4 августа 2015 в 21:08 #

    Если установить WP для тестов на локальную машину (Windows) и включить отладку:

    define('WP_DEBUG', true);

    То можно получить такие же кракозяблы как в первом рисунке по всему сайту и вывод такой надписи (любая тема, в моём случае classic):

    Notice: Функция register_sidebar вызвана неправильно. Р’ массиве аргументов для Р±РѕРєРѕРІРѕР№ колонки «Боковая колонка 1В» РЅРµ задан параметр id. Присвоенное РїРѕ умолчанию значение равно В«sidebar-1В». Чтобы убрать это сообщение Рё сохранить текущее содержимое Р±РѕРєРѕРІРѕР№ колонки, задайте вручную параметр id, равный В«sidebar-1В». Дополнительную информацию можно найти РЅР° странице «РћС‚ладка РІ WordPress». (Это сообщение было добавлено РІ версии 4.2.0.) in Z:\home\test1.ru\www\wp-includes\functions.php on line 3560

    К удивлению, это не всегда. То есть поставишь чистый WP для тестов и всё нормально, как ни крути. А бывает вот такое :-)

  • Дмитрий30 августа 2015 в 18:08 #

    Здравствуйте. Помогите, пожалуйста по следующему вопросу. Функции substr() нету, что делать? Как убрать этот вопросительный знак?

    • Дмитрий30 августа 2015 в 18:08 #

      Нашел, в дужках просто был текст, а я искал через поиск, по этому и не искалось)

  • Максим2 сентября 2015 в 13:09 #

    Здравствуйте!
    В первую очередь хотел сказать спасибо за статью! За разнообразность решения одной проблемы :)
    Но, к сожалению, я так и не смог решить проблему. Помогите, пожалуйста:

    Создал локальный сайт через Денвер. БД следующая:
    База данных: ut8_general_ci
    Language: russian (ru-utf-8)
    Сопоставление соединения с MySQL: ut8_general_ci
    Уже где только можно и нельзя поставил кодировку UTF8.
    На всякий случай в .htaccess прописал AddDefaultCharset utf-8

    Дело, собственно говоря в чем. Установил плагин Page Builder, добавляю строку, виджет, все нормально. Но если "Переключится на обычный редактор", то там и видно следующее:

    <a href="http://localhost/vetlikar/wp-content/uploads/2015/08/12121286.png"><img src="http://localhost/vetlikar/wp-content/uploads/2015/08/12121286-300x294.png" alt="12121286"></a>
    Паразитарные болезни свиней

    Это первая проблема. Кракозябра присутствует.
    Вторая: я обрез статью, и в конце появился знако вопроса �

    Помогите, пожалуйста.

    • Миша2 сентября 2015 в 21:09 #

      Здравствуйте!
      1) тут нужно смотреть, сходу трудно сказать
      2) а каким образом обрезаете статью?

  • Вячеслав18 сентября 2015 в 22:09 #

    Благодарю ! Помогло !

  • Руслан5 ноября 2015 в 13:11 #

    Здравствуйте. Недавно перенёс блог с опен-сервера на хостинг. У меня в таблицах БД код utf_general_ci, на хостинге unicode. Менял в пчпмайадмин на юникод, не помогло, вставил по вашему совету в htasess, тоже, а куда вставить не понял). Пробовал еще файл конфиг преобразовать ютф без бом, не работает..

  • Руслан5 ноября 2015 в 13:11 #

    а куда вставить mysql_query("SET NAMES 'UTF8'"); не понял).

  • Равиль18 ноября 2015 в 16:11 #

    А что делать если кракозябры исходят от плагина. Сейчас поясню: есть плагин регистрации. В нем есть настройка какие сообщения отправлять регистрирующемуся на почту. Они на английском. Когда изменяешь текст на свой, на русском языке на почту регистрирующемуся приходит письмо с кракозябрами. Ставишь английские буквы в сообщение - на почту приходят на английском. Где и как это можно исправить, помогите, подскажите пожалуйста?

    • Миша19 ноября 2015 в 08:11 #

      Нужно посмотреть, каким образом он это отправляет. Если через wp_mail(), то таких проблем быть не должно, а если через просто mail(), то возможно потребуется добавить параметры кодировки письма.

      • Равиль20 ноября 2015 в 07:11 #

        А как это можно посмотреть? нужно будет найти файл такой и именно туда добавить?

  • Равиль20 ноября 2015 в 07:11 #

    А, да, забыл, он ведь еще до отправки эти кракозябры показывает. Весь плагин сам на русский нормально перевелся. Только вот эта часть, где вводишь какие сообщения будут приходить на почту, показывает кракозябры. Ну и соответственно их и отсылает на ящик

    • Миша20 ноября 2015 в 09:11 #

      Да? Это уже другой разговор :)

      он ведь еще до отправки эти кракозябры показывает

      но на этом моменте нужно подробнее.

      • Равиль20 ноября 2015 в 09:11 #

        Плагин был весь на английском. Я его перевел на русский. Единственная часть которая не переводится, это там где заполняешь какой текст уведомления будет приходить подписчику. Т.е. например: человек заполнил форму, нажал "Отправить" показывается сообщение о том, что заявка отправлена, скоро на почту придет письмо, И одновременно приходит сообщение на ящик что заявка в данный момент находится на рассмотрении.
        Так вот в плагине, эти сообщения в настройках стоят стандартные на английском, их можно менять на свои. Если пишешь свои сообщения, на английском, то всё отображается нормальными английскими буквами. Но как только пишешь на русском и сохраняешь, прямо там же, где эти сообщения задаются, вместо русских букв становятся кракозябры. Соответственно что в этих окошках появляется, то он и отправляет. Эх, скриншот бы отправить, сразу думаю так сразу всё ясно станет

        • Миша22 ноября 2015 в 09:11 #

          Ну плагин косячный, нужно смотреть код и править, что еще тут скажешь.

          • Равиль23 ноября 2015 в 06:11 #

            о, вот какой, какой, а уж этот плагин очень грамотно сделан, просто заточен не под русскоязычную аудиторию, жалко что русскоязычных таких плагинов среди бесплатных нет. Ну, ладно, как бы то ни было, спасибо большое, за подсказки.

  • Руслан11 января 2016 в 23:01 #

    Привет. Я создавал страничку nopead++ с кодировкой в UTF-8 без BOM и прописывал , но когда загрузил на сервер сайт он получился весь в этих кракозябрах, много уже полазил и ничего не нашел, помогите ребята)))

    • Миша12 января 2016 в 06:01 #

      Привет, если ни один из перечисленных способов не помог, можете написать мне по емайл, я гляну :)

  • Владислав19 января 2016 в 02:01 #

    Спасибо! Помогло

  • Илья Волков16 апреля 2016 в 08:04 #

    У меня вот появляются после выставления текста через редактор такая кракозябра

    &nbsp;

    как ее можно убрать?

  • Walter10 августа 2016 в 10:08 #

    Моя проблема касается кодировок в MySQL. Почему-то русские буквы записываются в базу в виде цуаываыаыва вместо слова Корова, например.

    В базе везде стоит кодировка utf8_general_ci.
    В php файле есть:

    header('Content-type: text/html; charset=utf-8');
     
    mysqli_query("SET NAMES 'utf8';");
    mysqli_query("SET CHARACTER 'utf8';");
    mysqli_query("SET SESSION collation_connection = 'utf8_general_ci';");

    В самом php-файле нет никаких русских букв. Собственно значения c русскими буквами берутся из $_POST, куда они попадают из поля TEXTAREA.

    $request=$_POST['request'];
    $sql='INSERT INTO `table` (`request`) VALUES ("'.$request.'")';
    $q=mysqli_query($mysqli, $sql);

    Вывожу значение переменной $sql на экран через echo: INSERT INTO `table` (`request`) VALUES ("Корова").
    Захожу в базу - там записалось цуаываыаыва.

    Если через phpMyAdmin добавлять новую запись в таблицу, то все в порядке, записывается и потом отображается Корова русскими буквами.

    Ситуация одинаковая что на локальном сервере (MAMP), что на хостинге.

    Уже всю голову сломал, не могу понять, почему такого рода краказябры сохраняются в таблицу вместо русских букв. Буду рад любым подсказкам, в каком направлении можно еще покопать.

    • Миша10 августа 2016 в 13:08 #

      Добрый день!
      Можете скинуть по емайл мне доступ к хостингу? я поколдую немного, а то так что-то трудно сказать.

      • Walter10 августа 2016 в 13:08 #

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

  • Walter10 августа 2016 в 10:08 #

    В .htaccess стоит

    AddDefaultCharset utf-8

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...