[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Тотальный UTF-8 и мелкая проблемка
tectolog
Всем привет. Нужен ваш квалифицированный совет.
Ситуация:
1. Все файлы, передача данных в БД, данные в БД, сервер, БД, таблицы, поля в utf-8.
2. В БД хранятся следующего вида строки: абвгд, а-б-в-г-д-, т.е. слитное написание и разделенное символом "-"
3. Процедура скрипта: юзер вводит слитный (абвгд) набор символов для поиска, скрипт обрабатывает слитный набор через пользовательскую функцию, которая генерит дополнительно переменную с раздельным написанием (а-б-в-г-д-) введенного набора символов, далее отправляет запрос в БД с применением qwerty LIKE '%$slitno%' OR qwerty LIKE '%$razdelno%'
в результате выводятся только записи со слитным написанием.
4. Начал экспериментировать и обнаружил:
если содержание строк цифры (111 и 1-1-1-) - выводится все
если содержание строк буквы латинские (abcd и a-b-c-d-) - выводится все
если содержание строк буквы кириллические (абвгд и а-б-в-г-д-) - выводятся только записи со слитным написанием

ВОПРОС: как это можно вылечить?
Заранее спасибо.



Спустя 44 минуты, 49 секунд (1.02.2011 - 14:31) twin написал(а):
Цитата
скрипт обрабатывает слитный набор через пользовательскую функцию
где она?

Спустя 15 минут, 9 секунд (1.02.2011 - 14:46) tectolog написал(а):
//Функция генерит из абвгд а-б-в-г-д-
function defis($domain)
{
for($i = 0; $i < utf8_strlen($domain); $i++)
{
$na .= $domain[$i]."-";
}
return $na;
}

Спустя 14 минут, 41 секунда (1.02.2011 - 15:00) twin написал(а):
Прикольно)) А utf8_strlen тогда где?

Кстати, вот так не работает с кирилицей
 $na .= $domain[$i]."-";

Нужно так
    function defis($domain)
{
$na = '';
$len = mb_strlen($domain, 'utf-8');

for($i = 0; $i < $len; $i++)
{
$na .= mb_substr($domain, $i, 1, 'utf-8')."-";
}
return $na;
}

Спустя 36 минут, 59 секунд (1.02.2011 - 15:37) tectolog написал(а):
utf8_strlen - она ж стандартная:
    function utf8_strlen($domain)
{
$count = 0;
for($i = 0; $i < strlen($domain); $i++)
{
$value = ord($domain[$i]);
if($value > 127)
{
if($value >= 192 && $value <= 223)
$i++;
elseif($value >= 224 && $value <= 239)
$i = $i + 2;
elseif($value >= 240 && $value <= 247)
$i = $i + 3;
else
die('Not a UTF-8 compatible string');
}
$count++;
}
return $count;
}



Спустя 9 минут, 50 секунд (1.02.2011 - 15:47) twin написал(а):
Стандартная, это ты имеешь ввиду, что если mb не стоит?
Это в корне не верно, если работаешь с utf-8

Спустя 1 минута, 27 секунд (1.02.2011 - 15:49) tectolog написал(а):
опробовал ваш вариант - нетбинс ругается, что mb_strlen и mb_substr неизвестные функции, естественно - запрос вообще не выводится. Случайно, эти функции не надо как-то активизировать (включать)?
Спасибо.

Спустя 2 минуты, 51 секунда (1.02.2011 - 15:51) tectolog написал(а):
Цитата (twin @ 1.02.2011 - 12:47)
Стандартная, это ты имеешь ввиду, что если mb не стоит?
Это в корне не верно, если работаешь с utf-8

Так... я уже запутался... т.е. не правильно использовать utf8_strlen совместно с mb_... ?

Спустя 30 минут, 49 секунд (1.02.2011 - 16:22) twin написал(а):
У тебя не установлена библиотека. Давай угадаю... Денвер?

Если работаешь с UTF-8, тебе крайне сложно придется без неё. Лучше скачать и поставить. Или сразу поставить полный пакет, могу свой порекомендовать.

А то, что ты называешь "стандартной" функцией - всего навсего эмуляция. Не лучший вариант.

Спустя 2 минуты, 34 секунды (1.02.2011 - 16:25) tectolog написал(а):
в том-то и дело, не денвер, а платный хост nic.ru

Спустя 7 минут, 42 секунды (1.02.2011 - 16:33) twin написал(а):
Цитата
опробовал ваш вариант - нетбинс ругается
Кто ругается?

Спустя 2 минуты, 53 секунды (1.02.2011 - 16:35) tectolog написал(а):
расширение на хосте включил, теперь надо переписать функции под mb_...?

Спустя 2 минуты, 53 секунды (1.02.2011 - 16:38) tectolog написал(а):
голова кругом идет, несколько дней бился над этой темой, не netbeans ругается...
расширение включил, теперь все работает
Огромное спасибо за помощь!!!
Есть еще один вопрос как следствие решения этого, наверное

Спустя 37 секунд (1.02.2011 - 16:39) twin написал(а):
Не забудь указать кодировку обязательно. Можно один раз внчале скрипта
mb_internal_encoding('utf-8');
или в каждой функции, как у меня.

Спустя 18 минут, 56 секунд (1.02.2011 - 16:58) tectolog написал(а):
Полученная выборка сортируется через ORDER BY ASC следующим образом: символ "-", цифра, буква.
Поставили задачу, чтобы сортировка была: цифра, буква, символ "-"
Перекопал кучу инфы, нашел несколько вариантов решения:
1. в ORDER BY использовать CASE
2. найти collations с сортировкой цифра, буква, -
3. написать свой файл с правилами сортировки (collate)
4. писать пользовательскую функцию для метода пузырька с применением диапазонов
Пункт 4-ый для меня приемлем, метод пузырька нашел на php, теперь не могу понять логику действий применительно к диапазонам, я так понимаю, что надо делать диапазон для цифр, отдельно - букв и для "-"
Не подскажите что-нибудь по этой теме?

Спустя 1 день, 2 часа, 53 минуты, 38 секунд (2.02.2011 - 19:52) tectolog написал(а):
Тему можно закрыть.
Решение найдено:
функция usort($array, strnatcmp); + в запросе в БД ORDER BY должен быть прописан следующим образом ORDER BY binary(столбец)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.