Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Submit картинкой || Пишем плагин WordPress >>>

PHP Кодировка страницы

22.11.2011
PHP Кодировка страницы

Здравствуй уважаемый читатель блога LifeExample, кодировка веб страницы это очень интересный зверь, и за частую хищный для начинающих веб мастеров. Я уверен в том, что все новички сталкиваются с проблемой правильного отображения текста на страницах своего сайта. Ты дорогой читатель, наверное встречал в сети интернета ресурсы, на страницах которых отображался не читаемый текст, а кракозябры.

Кракозябрами в среде программирования веб сайтов принято называть символы не соответствующие тем, которые должны быть выведены на страницу. Например, на созданной вами странице должно отображаться приветствие: «Здравствуй читатель моего блога!», а на деле получаете непонятный набор закорючек «Р—РґСЂР°РІСЃС‚РІСѓР№ читатеРСЊ моего Р±РРѕРіР°!» – вот такие закорючки и есть злые КРАКОЗЯБРЫ.

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

И так, чтобы понять откуда появляются подобного рода иероглифы, нам нужно познакомиться с понятием кодировка страницы. Любой текст на компьютере представляется в виде набора байтов, в каждом из этих байтов определенным кодом — закодирован только один единственный символ. Так вот для того чтобы правильно расшифровать или раскодировать набор байтов и представить его в понятном человеку виде, браузеру нужно провести соответствие с одной из кодовых таблиц. Базовой кодировкой является ASCII кодировка, она содержит в себе коды 128 символов латинского алфавита и спец символов вроде скобок и решеток. Именно из ASCII появились первые русскосимвольные кодировки CP866 и KOI8-R, а из них вышла известная сегодняшним вебмастерам кодировка windows-1251. Не смотря на то, что все эти кодировки призваны для отображения русского текста, они все отличаются друг от друга кодами для одинаковых символов. Если текст писался в кодировке CP866, а браузер пытается раскодировать ее с помощью таблицы кодов windows-1251, то в результате мы получим не читаемые слова. Такое часто происходит при отправке сообщений через почтовый сервер.

Приведенные здесь названия кодировок далеко не все что существуют и используются в разных случаях, их намного больше чем вы думаете. С таким обилием кодовых таблиц образовалась проблема совместимости кодировок, и веб мастерам пришлось вставть на борьду с универсализацией кода, что занимало много времени и нервов. На сегодняшний день изобретена панацея для данной проблемы в виде универсальной кодировки utf-8, со временем она вытесняет используемые ранее кодовые таблицы символов, и сейчас уже не для кого не встает вопрос о том в какой кодировке лучше сохранять данные.

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

Существует четыре места на кухне программирования сайта, которые требуют соблюдения единого стандатра кодирования текста.

  1. Кодировки скриптов.
  2. Кодировка таблиц MySQL.
  3. Кодировка самой HTML страницы.
  4. Локаль используемая браузером пользователя.

Во всех этих составляющих сайта, должна использоваться единая кодировка, какая – решать вам, но я рекомендую utf-8, всетаки она универсальная)

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

Кодировки скриптов (шаг 1)

Для того чтобы все скрипты имели одну кодировку, нужно при создании нового скрипта указать желаемую кодировку в настройках вашего редактора. Приведу пример данной процедуры в NotePad++ . При создании нового PHP файла сразу идем в раздел Encoding, он находится в меню, и выбираем Convert to UTF-8 without BOM.

Перекодировка в notepad++

Выбираем именно Convert to UTF-8 without BOM, а не просто Convert to UTF‑8. Приставка without BOM означает то что в первых двух байтах файла будет зашифрована специальная информация о параметре кодировки, в скриптах нам не нужна никакая лишняя информация. В большенстве случаев сохранение с BOM не окажется криминальным, но когданить один из скриптов откажется правильно работать и одной из причин может отазаться именно информация заключенная в первых байтах файла.

Кодировка таблиц MySQL. (шаг 2)

Для того, чтобы узнать какие кодировки используются в ваше MySQL базе, воспользуемся интерфейсом phpMyAdmin. В разделе SQL напишем запрос:

1
SHOW VARIABLES LIKE 'char%';

Выглядеть это должно вот так:

SQL запрос в phpMyAdmin

Жмем ОК и получаем информацию о кодировках таблицы

SQL запрос в phpMyAdmin

Значения на против character_set_client и character_set_results должны совпадать, так как эти параметры отвечают за кодировку, в которой данные поступают в базу и за кодировку в которой данные берутся из базы.

Если они у вас различаются, то нужно в PHP коде в ручную установить нужную кодировку. Делается это вот такой строчкой:

1
mysql_query('SET names "utf8"');

После этого три переменные character_set_client, character_set_connection и character_set_results примут значение utf8.
Подробнее о том как с помощью PHP работать с базой данных можно прочесть в статье PHP работа с базой данных (Часть 1-3).

Кодировка самой HTML страницы. (Шаг 3)

Теперь данные взятые с базы и данные обрабатываемые в php скрипте, будут совпадать по кодировке, и выводиться в понятном для человека тексте. Но это еще не все, нужно указать кодировку в разделе для мета тегов:

1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Либо в cкрипте настроек php командой:

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

Если кодировка HTML будет задана сразу двумя способами, то приоритетным будет задание кодировки из php скрипта.
Также можно глобально задать правило кодировки HTML в файле .htaccess добавив в него строку:

1
 AddDefaultCharset UTF-8

Локаль используемая браузером пользователя. (Шаг 4)

Еще одна важная деталь при корректном отображении текста это установка локали:

1
2
// Кодировка UTF-8
setlocale(LC_ALL, 'Russian_Russia.65001');

При установки такой локали, пердставители других стран использующие другую кодовую страницу в своей операционной системе, будут видеть русский текст.

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

1
2
3
4
5
6
7
8
<?php
// Вывод заголовка с данными о кодировке страницы
header('Content-Type: text/html; charset=utf-8');
// Настройка локали
setlocale(LC_ALL, 'ru_RU.65001', 'rus_RUS.65001', 'Russian_Russia. 65001', 'russian');
// Настройка подключения к базе данных
mysql_query('SET names "utf8"');
?>

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

Читайте также похожие статьи:

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Павел

    Полезная статья, спасибо!

  • php-coder

    Спасибо большое! Все получилось после «шаг 1»!

  • Апполинарий

    Скачал .txt-файл, а там вместо русского текста кракозябры..
    Я могу преобразовать эти кракозябры в нормальный читаемый текст?

    • Mark

      Смотря какого рода кракозябры. Попробуйте открыть с помощью notepad ++ и конвертировать кодировку в ANSI либо в UTF. Если ничего не получится можете скинуть мне на e-mail файл, я попробую посмотреть.

  • Arthur

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

  • анонимус

    Смешно было читать статью, и видеть как форма отправки отображает крокозябры в кнопках,

    к последнему примеру — так нельзя, надо проверять был ли послан уже заголовок или нет

    1
    2
    3
    if (!headers_sent()) {
    header('Content-Type: text/html; charset=utf-8');
    }
    • Dima

      к последнему примеру – так нельзя, надо проверять был ли послан уже заголовок или нет

      1
      2
      3
      if (!headers_sent()) {
      header(‘Content-Type: text/html; charset=utf-8’);
      }

  • Mark

    анонимус
    > Смешно было читать статью, и видеть как форма отправки отображает крокозябры в кнопках,
    Представляю, насколько смешно. К сожалению мелкие ошибки встречаются у всех.
    Спасибо за дополнение.

  • Евгений

    добрый день.
    а у меня такая проблема. я еще учусь на phpadmin.
    сделал запрос- параметры сервера совпали с вашими.
    проблема такая: создал страницу html где вводится имя

    1
    2
    3
    4
    5
        <form action="action.php" method="post">
          <p>Ваше имя: <input type="text" name="name" /></p>
          <p>Ваш год рождения: <input type="text" name="age" /></p>
          <p><input type="submit" /></p>
        </form>

    потом в php обработке

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Ваши регистрационные данные:<br>
        <?php
        $a_str = '';
        $_str = htmlspecialchars($_POST['name']); //считать имя
        if (is_string($a_str))
        { //если строка
        echo "Ваше имя: $a_str";
        } else {
        echo "Имя введено неверно!";
        };
        ?>.<br>
        Вам: <?php echo(int)$_POST['age']; ?> лет.<br>

    так вот когда ввожу имя на русском то после обработки после слов «ваше имя» пусто, а если латинницей, то отображается. что же делать?

    • Mark

      Евгений пока я вижу только одну ошибку:

      1
      2
      3
      4
      5
      ...
      $a_str = '';
          $_str = htmlspecialchars($_POST['name']); //считать имя
          if (is_string($a_str))
      ...

      Вы присваиваете переменной $a_str пустую строку, а во второй строчке этого кода записываете полученное имя в переменную $_str, но в проверке условия вы все-таки проверяете $a_str.
      Если $_str заменить на $a_str, то все заработает.

  • Евгений

    ну да, тут просто опечатка была. но суть не в этом.
    упрощу код, в html вводим свое имя

    1
    2
    3
    4
    5
    6
    7
    8
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <meta http-equiv="Content-Type" content="text/html; charset=cp1251">
    <html>  <head>  <title>Работа с формами</title>   </head>
        <body>
        <form action="action.php" method="post">
          <p>Ваше имя: <input type="text" name="name" /></p>
          <p><input type="submit" /></p>
        </form> </body></html>

    В «action.php»

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"                  "http://www.w3.org/TR/html4/loose.dtd">
    <meta http-equiv="Content-Type" content="text/html; charset=cp1251">
    <html>  <head>  <title>вывод данных из формы</title></head>
        <body>
        Ваши регистрационные данные:<br>
        <?php
        $a_str = htmlspecialchars($_POST['name']); //считать имя
        echo "Ваше имя: $a_str"; //просто вывести имя на русском не получается
        ?>.<br>
        </body></html>

    нужно просто просто ввести и вывести, когда сервер apach забирает на русском то ничего не выводит

    Ваши регистрационные данные:
    Ваше имя: .

    а при вводе литинскими выводит

  • Mark

    Хм, странно у меня все работает, да и по логике все должно работать. Скорее всего загвоздка в настройках сервера.
    Можете попробовать прописать кодировку в .htaccess
    кажется это делается както — так:

    1
    AddType "text/html; charset=windows-1251"

    но не уверен что это поможет.

  • Mark

    Вот кстати скрипт на котором я тестировал логику работы.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
        if(isset($_POST['s'])){
        $a_str = htmlspecialchars($_POST['name']); //считать имя
        echo "Ваше имя: $a_str"; //просто вывести имя на русском не получается
        }
    ?>

        <form action="" method="post">
          <p>Ваше имя: <input type="text" name="name" /></p>
          <p>Ваш год рождения: <input type="text" name="age" /></p>
          <p><input type="submit" name="s" value="проверка"/></p>
        </form></code>
  • Эльвира

    у меня возникла такая проблема, когда я открываю в интернете документы допустим «Региональные экзамены и тд» то у меня появляется табличка «Параметры фильтра ASCII» и там нужно указать кодировку, стандартный шрифт, язык и разрыв текста((и когда я указываю, как я думаю, то у меня открывается документ со всякой кракозяброй( Помогите плииз.

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

  • Леонид

    у меня проблема, все кодировки выставлены в utf-8, но когда читаю имена файлов ,написанных кирилицей в каталогах, то в браузере вижу типа этого �����.txt Как быть? в чём соль?

    • Попробуйте перед выводом, полученные кирилические названия каталогов перекодировать в UTF-8 функцией iconv()

      1
      echo iconv("windows-1251", "utf-8", "Название каталога");
  • Юля

    Марк, можете мне помочь раскодировать текст? Я в этом деле далеко не спец, вообще все непонятно, но очень нужно прочитать письмо, а там буквы-буквицы непонятные. Буду очень признательна!!!

    • Скиньте свой текст мне на почту, попробую помочь.

  • PHPdeveloper

    Огромное спасибо, очень помогла ваша статья, битый час мучаюсь с кадировками, и причем ведь нажимал в Notepad++ «Преобразовать в UTF-8«, а оказывается просто нужно было нажать «Преобразовать в UTF-8 без BOM«

  • Игорь

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

    Испробывал ваши методы чето не помогло.

    спасибо за внимание.

    • Если есть БД, то нужно установить кодировку для нее mysql_query(‘SET names «utf8″‘); Затем проверьте в какой кодировке находятся фалы скриптов, и страниц сайта. Все они должны быть в UTF без BOM. Кроме этого можно явно указать заголовок для вывода контента header(‘Content-Type: text/html; charset= utf-8’);

      Обычно, этого достаточно. А вобще если вы не программист, то лучше обратиться к специалисту, сэкономите кучу времени.

  • Антон

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

  • Владимир

    Спасибо за статью, помогла вылечить кодировку… сначала вообще всё было закорючками… я по старой памяти кое-как вылечил кодировку текстов из БД, но потом столкнулся с проблемой кодировки в самих HTML тескстах… подлечил по Вашему методу (8 всё стало как и задумывалось.

  • Viktor

    Mark такая проблема:

    1
    <a href="mat_uroki/id_77.jpg" target="_blank">

    Данная фотка открывается коректно.

    1
    <a href="mat_uroki/id_77_1.hdr" target="_blank">

    А вот эта кракозябрами…
    В чём проблеа???Кодировка вся UTF-8 .

    • Может проблема в расширении .hdr? Обязательно использовать именно это расширение?

  • Сергей

    Добрый день. Скажите, как поменять кодировку. На сайте стоит windows-1251 — все работает.
    Вставляю данные из базы (в которой кодировка UTF-8) вставляю код к подключения mysql_set_charset(‘utf8’,$db);//кодировка бд
    получает вот эта бяка:
    ????????????, ??????? ?????. ??? ? ???????? ??? ????, ??? ??????? ? ???????? ??? ??????. ?????? ??????, ????? ??????????? ????????? ??? ??? ????????? ? ??????????. ???
    Пробую изменить кодировку в коде mysql_set_charset(‘utf8’,$db);//кодировка бд еще интересней получается. Как исправить проблему?

    • А заголовок установили UTF-8 ?
      Чтобы проблема исчезла, везде где возможно должна быть указана UTF-8. В базе, в каждой таблице, в заголовке файла, сам файл.

  • Артем

    Здравствуйте! Пытаюсь изменить скрипт слайдбанера шаблона на joomla. Хочу поменять слова с английского на русский. А в результате выдает символы �����. Буду очень признателен, если подскажите..)

    Отрывок скрипта:

    Озонаторы воздуха
    for your corporate
    Lorem ipsum dolor sit amet, consectetur adipiscing lorem
    ipsum dolor sit amet, consectetur adipiscing elit.
    Donec blandit enim libero, quis tincidunt arcu.

    <img src="templates/template ?>/images/slide1.png» alt=»Bolder Theme, for your corporate site» />

    • Сохраните файл в соответствующей для вашего проекта кодировке. Попробуйте сделать это xc помощью notepad++ так как описано в статье.

  • Elena

    Подскажите, пожалуйста, в чем может быть проблема…
    Весь сайт отображается на русском, но вот прикрепленный блок навигации выводится знаками вопросов…Кодировки прописаны (UTF-8.)
    Спасибо

    • Скорее всего не везде кодировки в UTF-8, смотрите внимательно, в каких кодировках находятся скрипты выводящие блог навигации.

  • Elena

    Подскажите, пожалуйста, в чем проблема… Сайт полностью отображается на русском, но блок навигации выдает знаки вопросов…(принимает только английский). Кодировки выставлены UTF-8. При смене в файле .htaccess кодировки на windows-1251 сайт отображается крокозяблами, но зато навигация выводится на русском…
    Спасибо

    • А навигация из БД берется? Может надо прописать кодировку для БД.

  • yuklov

    Спасибо! Помогло! (Из Узбекистана)
    Раҳмат, ёрдам берди! (Ўзбекистон)

  • Андрей(boosya)

    Здравствуйте! Такой вопрос: в блоге под заголовком поста выводится информация, кто разместил —

    Разместил Andrey ��зменить дальше число месяц…

    Посмотрел файл single.php там:

    ещё строчка есть:
    �звините, по Вашему запросу ничего нет

    Пожамкались начальные буквы «и»

    В comments.php опять же:
    �мя
    Во всех папках произошли изменения, никак не пойму — с чего мне начать, где исправлять?…
    Помогите разобраться — пожалуйста!

  • Спасибо за статью.Подскажи Марк нужно ли в моем случаи на движке Dle 9.7 перекодировать все файлы с ANSI в utf-8 без bom?
    Когда установил движок на локалку (денвер)были кракозябры но после перекодировки в utf-8 без bom файла main и ещё каких то же не помню все стало нормально.
    Файлов в движке очень много…
    Дайте совет!!!

    • Главное чтобы все файлы были в одной кодировке либо строго в ANSI либо строго в UTF-8, тоже касается и таблиц в базе. В этом случае проблем не возникнет. А перекодировать файлы какого-либо движка считаю не правильно.

  • саша

    У меня такая проблема захожу на свой сайт а там вот это:
    ????????????? ??????????? ???????? ?7??? ?????.
    Что делать?
    И я нуб можете обьяснить русским языком?

    • Проверьте кодировку во всех местах : mysql, подключаемые файлы. Она должна быть везде одинаковой.

  • maksim

    У меня тут есть такая проблемка: я пользуюсь HTML уроками от myrusakov.ru — HTML учебник, я идеально просматриваю уроки по созданию HTML страницы, и внимательно смотрел урок «Установка Локального сервера «Denwer-3». Я всё это дело установил, всё работает, всё проверено. первая HTML страница успешно создана, нет никаких косяков, всё идеал, но когда я проверю написаное дело в браузерной строке, у меня вместо русских букв наблюдаются аЂаЕаЛаЕаКаАаНаАаЛ аЂа?аЂ и т п… Как мне от этого избавится?? Установлена кодировка в HTML странице . Вот меня интересует вопрос, почему не работает русский язык? Я пользуюсь программой NotePad + + — я даже пробывал в меню Кодировки менять на все уже кодировки, меняется из карякулей в карякули, но русский язык я так и не увидел! Помогите пожалуйста! Без этого урока я не могу продолжить дальнейшие уроки.

  • eliteparfum.dp.ua

    в фаиле подключения к бд напишите
    mysql_query(‘set names utf8’);
    mysql_query(‘SET CHARSET utf-8’);

  • Евгения

    Я понимаю, что такими вопросами уже всех достали, но прощу, не забивайте ногами!
    Мальчики, кто поможет мне решить проблему кодировки сайтбаза в американском движке. И скрипт и база в utf8, но запись с сайта отображается в базе кряками, поменяешь в базе текст на киру, а на сайте ?????…Уже столько всего прочитала, голова распухла…видимо без вашей помощи мне это дело не осилить!
    Пожалуйста, помогите, буду очень признательна!
    Напишите мне на почту!

  • yulits

    Изначально стоял тег , но выводились крикозябры, помогло только добавление header(‘Content-Type: text/html; charset= utf-8’);
    Спасибо большое!

  • Pavel

    СпасиБог!

  • Дмитрий

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

  • Шерзод

    Не могли бы рассказать про BOM подробнее?
    Дело в том что когда я сохраняю файл на utf 8 без BOM, текст отображается не правильно, а когда с BOM все нормально.

    • BOM — нужен для UTF-16, UTF-32, например для кодирования иероглифов. Для кодирования кириллицы достаточно UTF-8. Сам по себе BOM — это Byte Order Mark, по посту говоря информация в начале каждого файла определяющая количество байт в текущей UTF кодировке. Не рекомендую использовать UTF с BOM в веб-страницах и скриптах, т.к. невидимая информация, если она есть — выводится на страницу до использования сессий и заголовков приложением, что влечет за собой ошибки скриптов.

  • Александр

    Доброго времени! Все файлы php сохраняю UTF-8. Эту кодировку проставил везде где нужно и где нельзя. Выхожу из Notepad, затем опять открываю эти файлы в нём и опппа, кодировка изменилась на ANSI. Что может быть не так??? Спасибо за ранее.

    • Нужно не просто выбрать кодировку, а преобразовать в нее, для этого есть специальный пункт в разделе «Кодировка», после этого необходимо сохранить файлы.

  • Лилия

    Здравствуйте. У меня такая проблема.
    -все скрипты в utf-8,
    -БД — в utf-8;
    -html-страницы в win-1251.

    html-страниц ооочень много, суть скрипта в том, чтоб открывать эти страницы по пути, прописанному в БД. Естественно, все страницы отображаются крякозяблами.

    Менять кодировку в html-страницах- не вариант. как настроить скрипты так, чтоб страницы в браузере отображались в win-1251?

  • Татьяна

    Доброго времени суток. А Вы не знаете, почему может быть вот такая ерунда: когда я ввожу в код php строки, то они выводятся на экран нормально, но стоит обработать их функциями php и они сразу же превращаются в крокозябры. Например если я выведу строку:

    1
    echo $BBB="Наш мячик очень оригинальный!";

    то она в таком же виде и будет отображена на экране. Но уже попытка преобразовать строку к нижнему регистру:

    1
    echo $loveTextB= mb_strtolower($BBB);

    Выведет: ��� ����� ����� ������������!
    В итоге с функциями творится непонятно что (например, попытка найти первую позиции вхождения в мою строку входит подстроки «мяч»:

    1
    echo $pos=stripos($loveTextB, $loveTextA);

    , приведёт к выводу числа 7, что абсолютно не соответствует действительности), и я подозреваю, что это из-за этой вот петрушки с кодировками. Потому что если я перехожу на английский регистр, то всё становится нормально. И перевод к нижнему регистру строку не меняет и позиции правильно выдаются!
    На сервере у меня настройки такие же, как в Вашем примере. Кодировка в разделе для мета тегов указана: ;
    В cкрипте настроек php прописаны команды: header(‘Content-Type: text/html; charset= utf-8’) и setlocale(LC_ALL, ‘Russian_Russia.65001’);;
    Подключен файл .htaccess со строкой: AddDefaultCharset utf-8. Ну а к базе данных я в данном скрипте не обращаюсь.
    Вы не знаете, почему кодировку меняют функции php и что с этим делать?

  • МАРИЯ

    Марк, спасибо за статью. Более-менее стало понятно, где нужно проверять кодировки. Но моя проблема, к сожалению, не решилась — пока только учусь работать с базами данных.
    У вас написано:
    «Значения на против character_set_client и character_set_results должны совпадать.
    Если они у вас различаются, то нужно в PHP коде в ручную установить нужную кодировку. Делается это вот такой строчкой:
    mysql_query(‘SET names «utf8″‘);»

    У меня эти кодировки совпадают.Но если бы не совпадали, то где именно нужно было бы писать эту строчку — в самом выполняемом скрипте PHP? И имеет ли значение ДО подключения к базе, или ПОСЛЕ?
    PHP скрипт настроек — это php.ini?
    До серверного мне не добраться, можно написать свой в корневой папке?
    На домашнем компьютере, на Денвере, скрипт работал правильно, и русские буквы выводились правильно, а после экспорта базы на сервер, вместо русских букв из базы выводятся вопросики. Я нашла только одно отличие: дома в PhpmyAdmin и напротив названия таблицы и во второй строке напротив количества таблиц стояла одна кодировка InnoDB, utf8_general_ci, а на сервере — напротив названия таблицы — InnoDB, utf8_general_ci, а во второй строке — MyISAM, latin1_swedish_ci(по умолчанию).
    Может ли это быть причиной? Может я неправильно экспортировала базу?
    Очень уж хотелось бы в этом вопросе разобраться раз и навсегда! 🙂 СПАСИБО.

    • > У меня эти кодировки совпадают.Но если бы не совпадали, то где именно нужно было бы писать эту строчку — в самом выполняемом скрипте PHP? И имеет ли значение ДО подключения к базе, или ПОСЛЕ?

      Да, в самом выполняемом скрипте PHP сразу после подключением к БД.

      > PHP скрипт настроек — это php.ini?

      Верно.

      >во второй строке — MyISAM, latin1_swedish_ci

      Да, запросто это может быть причиной.

  • Артем

    У меня проблема, мучаюсь уже несколько дней. У меня всё в utf-8, и в html заголовке и в php. А на почту приходят вот такие вот:┤п╣п╫п╟ п╟п╫п╨п╣я┌
    Спасите пожалуйста

    • Письма надо слать в кодировке KOI8-R, тогда все будет — ОК.

  • Артем

    А как это реализовать?

  • Никита

    Помогите пожалуйста всё вроде проверил и только добавил в файл скрипта mysql_query(‘SET names «utf8″‘); вот полный текст скрипта:

    <?php
    mysql_query('SET names "utf8"');
    $resalt = mail("nkosach@list.ru","Анкета с сайта","С сайта была получена анкета с такими данными: \r\nИмя: $_POST[name] \r\nПароль: $_POST[password] \r\nЛюбите ли экономить время: $_POST[time] \r\nСколько часов в день спит: $_POST[sleep] часов \r\nСвои наработки в экономии времени: $_POST[taxt]");
    if ($resalt) {
    echo "Сообщение отправлено успешно»;
    }
    else {
    echo «Сообщение не отправлено =(«;
    }
    ?>

    в результате при запросе к файлу выбивает ошибку:

    Warning: mysql_query(): Access denied for user ‘root’@’localhost’ (using password: NO) in /home/u246847678/public_html/formdata.PHP on line 3 Warning: mysql_query(): A link to the server could not be established in /home/u246847678/public_html/formdata.PHP on line 3

    что делать сделал так но не работает.

  • Никита

    Ясно. Спасибо. Просто я ещё не учил php и MySQL. Этот код показывался как пример в видеоуроке Попова «как привязать код к форме в html» видимо чтоб понять то что описывается в этой статье и исправить ошибку мне нужно выучить php верно?)

  • Александр

    Очень нужен совет! Взял страницу захвата, редактировал в Notepad++ под себя, закачал на хост. Изображения нормально, текст кракозябры. Помогите,если нужна ссылка на страницу напишу.

  • Van_Gal

    Отличная статья, большое спасибо помогла

  • Владимир

    Здравствуйте. Строчку (‘SET names «utf8″‘); нужно прописывать при каждом новом соединение с базой? Иначе в базу записываются кракозябы. Это нормально, каждый раз прописывать данную строчку или я что-то упускаю?

  • Александр

    Спасибо огромное!!!! Ты меня очень выручил!!!

  • Роман

    Большое спасибо автору за публикацию. Я нашел для себя нужную информацию и исправил ошибку с кодировкой. «Кракозябры» превратились в нормальные буквы.
    Решить проблему удалось созданием пустого файла .htaccess и добавлением в него (единственной) строки AddDefaultCharset UTF-8.

    Еще раз большое спасибо!

  • Яна

    Доброго времени суток!!!
    Вы моя последняя надежда!!!
    Просто я в отчаянии!!!
    Я новичек. Еще так сказать деревянный чайник))) на пока все получалось. дошла до уроков установки локального сервера (Denwer’a) и работы с обработчиком форм. и вот тут я застряла! в php файле нет ошибок — я проверила 300 раз
    в html тоже. при заполнении формы после кнопки «ввод» браузер выводит мне исходный код php файла! я уже кучу статей перечитала, просмотрела миллион туториалов — я не нашла решения.

    вот то, что сделала и то, что, собственно, не помогло:
    1 перезагружала комп
    2 перезапускала Denwer
    3 переустанавливала denwer
    4 преобразовала в UTF 8 без BOM
    5 релактировала файл .htaccess
    ….

    в общем сил моих уже нет(

    хочу добавить, что при первых попытках обработать форму у меня получилось, но только один раз, потом все полетело к *…*!

    почти уверена, что дело не в коде, а скорее в настройках
    подскажите что нужно сделать!!! :*(

  • Andry

    Тоже достаточно долго бился с кодировкой, когда простой текстовый файл с кириллицей (.CSV), размещенный на хостинге, браузер «тупо в лоб» отображает корректно, а вот после его же обработки РНР-скриптом кириллица не то что не выводится кракозябрами — она вообще никак не выводится! Т.е. выводится все, кроме кириллицы, на месте которой ПУСТО.
    Бился долго и упорно, пока на вашей страничке не обнаружил ЧУДО, к-рое тут же все вылечило — «Выбираем именно Convert to UTF-8 without BOM…». До этого нигде и никогда не встречал такого совета.
    СПАСИБО!

  • Zhiv37

    Делаю ЧПУ для интернет магазина и всё, в общем, работает, но только пока я использую латинские символы. Попробовал в базе данных дать наименования по-русски, кириллицей, и вместо наименований отделов и категорий получил «0». Не отобразились. Но ведь я же сам, своими глазами, видел эти запросы с кириллицей. Как-то она в адресную строку у людей попадает. Все мои попытки перекодировать кириллицу с помощью стандартных функций к успеху не привели. Не хочет она записываться в ссылку. Закодировано всё в utf8. И даже не представляю себе, с какого конца смотреть начинать. Можно, конечно, транслит использовать, еще какие-то ухищрения, но это все коряво. Как решается проблема? Подскажите, пожалуйста.

  • satyva

    Чем заменить
    mysql_query(‘SET names «utf8″‘);
    ???

    не хотелось бы выполнять перед каждым запросом к базе

  • Boris

    Марк я так понял,что Вы все пишете верно,однако я должен Вас огорчить — есть одна тонкость, а именно две возможности
    1 вариант — независимо как настроен сервер мускула в скриптах использовать нужные кодировки.
    2 вариант — независимо от скриптов можно настроить сервер мускула на отдачу только одного вида кодировки.
    Вот для второго варианта в настройках конфига мускула
    пишем эти инструкции
    skip-character-set-client-handshake
    (эта игнорирует все кодировки от клиента)
    character-set-server = utf8
    collation-server = utf8_unicode_ci
    (эти две позволят серверу все отдавать клиенту в UTF8)
    init_connect=‘SET collation_connection = utf8_unicode_ci’
    (эта кодирует конект подключения,но не работает под рутом, а под ним конектятся большинство скриптов в корпоративах как к локалхосту)
    В общем если сервер настроен как указано выше и совпадает с кодировкой скриптов,то в этом случае кодировки символов и в записях базы мускула и в итогах вводе/выводе скриптов будут идентичны.
    Однако не во всех скриптах могут быть изменены кодировки (например шифрованные зендом), в этом случае кодировки сервера и скрипта могут быть не идентичны.
    Это я к тому, что в паре РНР-MySql 100% решение совместимости кодировок скриптов и записей базы ПРИНЦИПИАЛЬНО НЕ РЕАЛИЗУЕМА.
    Либо Вы настраиваете все на UTF8 и отказываетесь от полезных скриптов с иной кодировкой
    Либо Вы не настраиваете сервер только на UTF8, прописываете все что Вы описали для скриптов,но при этом оставляете возможность работы с скриптами в иной кодировке.
    Я предпочитаю последний вариант.
    А 100% UTF8-ый вариант необходим только в одном случае-когда есть необходимость непосредственного редактирования записи базы данных(ошибки ввода через форму и т.п.),но в серьезных проектах эта возможность исключается обработкой ошибок.Да и на большинстве хостингов кто же Вам позволит изменять кодировки сервера…

  • Борис

    У меня настройки такие

    Сервер: Localhost via UNIX socket
    Тип сервера: MySQL
    Версия сервера: 5.6.25-0ubuntu0.15.04.1 — (Ubuntu)
    Версия протокола: 10
    Пользователь: root@localhost
    Кодировка сервера: UTF-8 Unicode (utf8)
    И такая конструкция как Вы указали
    mysql_query(‘SET names «utf8″‘);
    не работает
    Работает такая
    mysql_query(«SET names ‘utf-8′»);

  • Дмитрий

    Борис,правильно будет так :

    mysql_query(«SET names utf8»);

  • Борис

    Спасибо,совершенно верно — подтверждаю 🙂

  • Sergei

    Здравствуйте. Помогите разобраться с этой проблемой. При выводе ссылок из базы название принимают вот такой вид:
    Заработок в с��ти Зар��боток в сети вввввввввввввввввввввв��вввввввввввв

    С выводом английских слов все в норме.
    Кодировка файлов в UTF-8 без БОМ, база в UTF-8, таблица где лежат сами ссылки в UTF-8. В самой таблице название ссылок все ОК.

    Заранее Спасибо. Сергей.

  • Николай

    Здравствуйте! Подскажите мне. Приобрёл скрипт устоновил на хостинг все отлично показывает на русском языке без всяких закорючек и вопросов. Но в графе ;последние 10 ссылок; показывает вот это: Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in /home/wm72181/domains/stop-hamhayp.info/public_html/index.php on line 109
    Помогите! Спасибо!

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

    Не отвечать

    Подписаться на комментарии к этой статье по RSS

    Яндекс.Метрика