За последние 24 часа нас посетили 36628 программистов и 1721 робот. Сейчас ищут 797 программистов ...

Кодировка- исправил- ищу первоисточник проблемы

Тема в разделе "PHP для новичков", создана пользователем php_user, 23 апр 2014.

  1. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    При открытии страницы в браузере кодировка не та.
    Похожая ситуация тут http://forum.php.su/topic.php?forum=1&topic=7133
    У меня везде где только можно (см.ниже пронумерованные пункты) прописана кодировка utf-8.

    При открытии страницы в браузере, браузер автоматически берет кодировку "utf-8". Название страницы на русском языке (название страницы берется НЕ из базы данных), однако содержание страницы в непонятных символах (содержание страницы вытягивается запросом из базы данных).
    Если в браузере выбираю кодировку "windows-1251", то все меняется наоборот- название страницы на непонятном языке, а содержание страницы на русском.

    Подробнее про настройки:
    1)- При открытии файла *php в noutpad++ программа показывает кодировку "utf-8 без DOM";
    2)- В самом файле *.php прописано
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    3)- В директории сайта лежит файл ".htaccess", в котором написано "AddDefaultCharset UTF-8";
    4)- Если открыть myphpadmin то он показывает кодировку таблиц "utf8_general_ci";

    Решение я нашел, прописав после подключения к базе код "mysql_query("SET NAMES utf8;");", но вот первоисточник проблемы не понимаю.
    Вопрос следующий: почему у меня была данная проблема? Как можно было исправить данную ошибку без "mysql_query("SET NAMES utf8;");"?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну если коротко, то никак, а если по-нормальному, то только (используя mysqli) через специальный метод выставления кодировки общения с сервером. ну или в конфиге. хз где там это. выставляю при каждом подключении.

    Может кому пригодится:
    Код (PHP):
    1.   public static function Init() {
    2.     if (!static::$inited) {
    3.       SLT::SectionStart(__CLASS__ . "::Init()");
    4.       //вместо ворнингов в лог мускул будет кидать эксепшены
    5.       mysqli_report(MYSQLI_REPORT_STRICT);
    6.       try {
    7.         ThrowOnTrue(empty(static::$settings), 'No DB settings.');
    8.         SLT::Step('Connecting...');
    9.         static::$connect = new mysqli(static::$settings['host'], static::$settings['login'], static::$settings['password'], static::$settings['dbname'], static::$settings['port'], static::$settings['socket']);
    10.         SLT::Step('Connected (' . static::$connect->host_info . ')');
    11.         static::$connect->query("SET NAMES '" . static::$settings['codepage'] . "'");
    12.         ThrowOnFalse(static::$connect->set_charset(static::$settings['codepage']), 'Не могу установить требуемую кодировку.', 100001);
    13.         static::$inited = TRUE;
    14.       } catch (Exception $e) {
    15.         echo "\nТехническое сообщение:\n Ошибка №" . $e->getCode() . ". " . $e->getMessage();
    16.         //1045 - не вошел в бд.
    17.         exit();
    18.       }
    19.       SLT::SectionEnd();
    20.     }
    21.     return true;
    22.   }
    А именно:
    Код (PHP):
    1. static::$connect->query("SET NAMES '" . static::$settings['codepage'] . "'");
    2.         ThrowOnFalse(static::$connect->set_charset(static::$settings['codepage']), 'Не могу установить требуемую кодировку.', 100001); 
     
  3. php_user

    php_user Новичок

    С нами с:
    19 апр 2014
    Сообщения:
    91
    Симпатии:
    0
    Спс, порасшифровываю ответ на досуге
    (я начинающий- много непонятного)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    начни с того, чтобы работать с mysqli
    http://php.ru/manual/mysqli.construct.html
    с объектом с такими вот стрелочками:
    Код (PHP):
    1. $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
    2.  
    3. /*
    4.  * This is the "official" OO way to do it,
    5.  * BUT $connect_error was broken until PHP 5.2.9 and 5.3.0.
    6.  */
    7. if ($mysqli->connect_error) {
    8.     die('Connect Error (' . $mysqli->connect_errno . ') '
    9.             . $mysqli->connect_error);
    10. } 
     
  5. INETCHIK

    INETCHIK Активный пользователь

    С нами с:
    13 фев 2014
    Сообщения:
    35
    Симпатии:
    0
    В .htaccess:
    php_value default_charset utf-8
    или в верху php файла (head.php или config.php)
    Код (PHP):
    1. header('content-type:text/html;charset=utf-8');
    второй вариант через пхп файл имеет преимущества перед кодировками в .htaccess и <meta>
    А что с БД не знаю...