Магия кодировок

Тема в разделе "PHP программирование", создана пользователем vital, 27 сен 2010.

  1. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Преамбула.
    Надо сделать автодополнение в инпут, типа как в гугле, это стало модно. Не долго думаю выбрал ЭТОТ
    плагин для джквери, как первый попавшийся.
    Була.
    Следствие выявило, что русские буквы приходят аякс обработчику(пхп срипту) как хрен знает что. Руками всунул в плагин encodeURIComponent(). Буквы стали приходить нормально, urldecode() возвращает то что надо.

    Строки для дополнения берутся из бд. Кодировки всего и везде прописаны как UTF-8.

    Беда вот в чем... Русские буквы из урлдекоде!=русским буквам из бд.

    Далее таблица и код обработчика, что бы было понятнее..

    Код (Text):
    --
    -- Database: `SPRAVKA`
    --

    -- --------------------------------------------------------

    --
    -- Table structure for table `Student`
    --

    CREATE TABLE IF NOT EXISTS `Student` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `fio` varchar(200) COLLATE utf8_bin NOT NULL,
    `nomprikzach` int(11) NOT NULL,
    `dataprikzach` date NOT NULL,
    `passport` varchar(20) COLLATE utf8_bin NOT NULL,
    `address` varchar(50) COLLATE utf8_bin NOT NULL,
    `phone` varchar(10) COLLATE utf8_bin NOT NULL,
    `group` varchar(5) COLLATE utf8_bin NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    Код (PHP):
    header("Content-type: text/plain; charset=utf-8");
    if (empty($_GET["q"]))exit;
    $q=$_GET['q'];
    include_once("../config.php");
    $q=urldecode($q);
    $handle=mysql_connect($dbhost,$dbuser,$dbpass) or exit;
    mysql_select_db($dbname,$handle) or exit;
    mysql_query('SET NAMES `utf8`');
    $res=mysql_query('SELECT id,fio FROM student',$handle) or exit;
    while($row = mysql_fetch_assoc($res))
    {   echo $row['fio']."====".$row['id']."===".$q."\n"; //Для дебагу, что бы видеть что сравниваем ниже..
    if (strpos(strtolower($row['fio']), $q) !== false) //Не выполняется, возвращает фолс, когда буквы те же. Например строка фамилия, а буква - ф
    {
    echo $row['fio']."|".$row['id']."\n";
    }
    }
    так вот. ЧТО ЗА БРЕД?
     
  2. KoMaTozZz

    KoMaTozZz Гость

    Возможно Вам поможет "AddDefaultCharset utf8" в .htaccess и COLLATE=utf8_general_ci;

    p.s. Зачем каждый раз выбирать ВСЕ записи? чем не подходит вариант запроса
    Код (PHP):
    $res=mysql_query('SELECT id,fio FROM student where `fio` like '{$q}%';',$handle) or exit;
     
  3. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Проблему решил другим.
    А они и не выбираются. Результат кешируется, за ненадобностью опущено.

    Добавлено: Но спасибо за вариант)
     
  4. KoMaTozZz

    KoMaTozZz Гость

    Ну так поделитесь решением, авось кто-то на подобную проблему наткнется? ;)

    p.s. Кстати, кажется мне, что
    Код (PHP):
    $encoding = mb_detect_encoding($row['fio'], "auto" );
    $q = mb_convert_encoding( $q, "UTF-8", $encoding);
    тоже должно сработать. Но это я так.. Мысли :lovecodeby: Для других
     
  5. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    Так я бы поделился если бы понял все точно сам.
    Ну суть в том, что для функций работы со строками помогло явное указание что они работают с юникодом(необязательный параметр), что, вобщем-то странно т.к. для работы с юникодом они и выдуманы. Ну.. потом там еще было немного правка конфига сервера, но суть в том, что выше. Ниже рабочий вариант.
    Код (PHP):
    header("Content-type: text/plain; charset=utf-8");
    error_reporting(0);
    if (empty($_GET["q"]))exit;
    $q=$_GET['q'];
    include_once("../config.php");
    $q=mb_strtolower(urldecode($q),'UTF-8'); //вот например как тут
    $handle=mysql_connect($dbhost,$dbuser,$dbpass) or exit;
    mysql_select_db($dbname,$handle) or exit;
    mysql_query('SET NAMES `utf8`');
    $res=mysql_query('SELECT id,fio FROM student',$handle) or die(mysql_error($handle));
    while($row = mysql_fetch_assoc($res))
    {  
    if (mb_strpos(mb_strtolower($row['fio'],'UTF-8'), $q,0,'UTF-8') !== false)
    {
    echo $row['fio']."|".$row['id']."\n";
    }
    }
     
  6. KoMaTozZz

    KoMaTozZz Гость

    Немного не согласен с Вами, ибо назначение их работы - мультибайтовые строки (UTF-8, UTF-16, UCS2, etc...). Т.е. странного ничего нет в том, что по умолчанию они не работают с UTF-8 (которая нужна Вам), т.к. полная поддержка данной кодировки предусмотрена в php6.

    Кстати, я запустил код, который Вы указали в первом посте - у меня все заработало "на ура". Как я и предпологал в своем первом ответе - решение кроется в AddDefaultCharset UTF-8 и collate=utf8_general_ci (эти параметры я бы рекомендовал использовать всегда, и, особенно, если используете ajax). Но если Вам угодно использовать mbstring - пожалуйста :)

    И еще дам несколько советов (не думайте, что я пытаюсь Вас учить, нет ;) )

    1) При тестировании желательно всегда включать отображение ошибок, warning и notice.
    Код (PHP):
    Это позволит проще находить и устранять ошибки и неточности в коде :)

    2) У Вас есть
    Код (PHP):
    if (empty($_GET["q"]))exit;
    $q=$_GET['q'];
    Лучше писать так
    Код (PHP):
    $q = (isset($_GET['q'])) ? $_GET['q'] : exit();
    При отсутствии параметра q в GET в первом случае будет notice, во втором обработается корректно.

    3) Ну и, конечно же, проверяйте то, что приходит в GET и POST :) Вот простой пример применения функций addslashes и htmlentities ко всем элементам массива $_GET :
    Код (PHP):
    $_GET = array_map('addslashes', $_GET);
    $_GET = array_map('htmlentities', $_GET);
     
  7. vital

    vital Больной Компом Детектед

    Регистрация:
    29 янв 2006
    Сообщения:
    2.468
    Симпатии:
    27
    При тестировании так и делаю)
    Ну может быть)
    Это да..)
     
Загрузка...
Похожие Темы - Магия кодировок
  1. deeeman
    Ответов:
    2
    Просмотров:
    2.580
  2. morpheus
    Ответов:
    21
    Просмотров:
    7.762

Поделиться этой страницей