данные из базы в формате UTF-8 - сортировка

SiMM

Новичок
PHP:
function UTF8_substr($str,$from,$len){ // (C) SiMM
  return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
                       '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
                       '$1',$str);
}
Идея, думаю, понятна, если интересно - можешь заняться оптимизацией под свою задачу. Одного не пойму - почему бы не делать это средствами базы, и какая нафиг принципиальная разница, будет оно так же сортироваться по второй букве для английского контента, или не будет.
 

SiMM

Новичок
Автор оригинала: Мутник
просто мне надо немного другое.
Вот и написал бы, что тебе надо - может подобрали бы оптимальное решение. В любом случае, даже если нужна только первая буква - это вполне можно решить средствами SQL, тем более, если она поддерживает мультибайтные кодировки (предполагаю, поскольку сам не сталкивался).
 

Мутник

Новичок
ок. Вот что мне надо:

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

Если бы нужно было сделать при перезагрузке - это не проблема, просто в базе бери и вытаскивай, по LIKE. А мне нужно вытащить все сразу, рассортировать, а потом подогать под JS так, чтобы удобно было слоями щелкать между этими буковками....

Нечто подобное легко было реализовано при кодировке Windows-1251, но тут на сайте 4 языка, так что приходится использовать кодировку UTF-8.

теперь более мене понятно, что я хочу???

можно, конечно, сделать так, как было предложено ранее:

PHP:
letters = array('а','б','в'...);
а потом то же самое с латинскими буквами... и вытягивать из базы, но это неправильно......
 

SiMM

Новичок
Вытягивай за раз, делая ORDER BY BINARY name (+ возможно GROUP BY name, чтобы не выводить одно и то же имя по нескольку раз), разбить полученные данные в группы по первой букве при выводе - проблем не составит. Остаётся лишь одна загвоздка - имена с большой буквы будут раньше имён с маленькой. Если, конечно, у тебя есть имена с маленькой. В принципе, можно наверно извернуться и написать выражение в ORDER BY, только я не могу его представить для всех возможных языков ;)
Хотя конечно можно ещё завести "весовое" поле в таблице, где хранить код первого символа, приведённого к верхнему регистру, в Unicode и делать ORDER BY по нему.
 

Мутник

Новичок
Мдя уж... Тут тоже геморроя не меньше...

тогда такой вопрос: а можно ли узнать первую букву перед сохранением в базе и хранить ее в верхнем регистре в отдельной ячейке????
 

SiMM

Новичок
Мутник, можно конечно. С кириллицей то всё просто - найти закономерность можно глянув на таблицу simm.superihost.com/charset.php?table=1024 (маленькие от больших отличаются на 32, если перевести в Unicode - имхо, тебе так будет проще, исключение - буква ё).
С латиницей и так всё понятно - та же разница на 32, а по поводу других языков - не знаю, ты же их даже не назвал, впрочем, можешь сам поискать закономерность (выбрав нужную таблицу там же).

-~{}~ 14.01.05 20:07:

Про Unicode и UTF-8 можешь почитать здесь и здесь
 

Мутник

Новичок
Симм:

В продолжение темы: у меня в добавок ко всему имеются еще латышский и немецкий языки (и там и там хватает своих спец. символов).

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

SiMM

Новичок
Мутник, а в чём проблема? Чем тебя не устраивает UTF-8 для решения твоей задачи и записи в csv-файл? Конечно, читающему софту придётся знать, что это в UTF'е. Либо использовать вариант 1, т.е. &#код; - но опять же не факт, что читающий софт отнесётся к этому с должным пониманием. Либо использовать в пределах одного csv-файла только один язык (что наверно тоже не очень удобно). У меня к сожалению (или к счастью) нет необходимой практики в работе с csv-файлами, поэтому сказать что-либо конкретно я не могу.
Если же читающий софт так же твой - то проблемы, как таковой, я не вижу.
 

Мутник

Новичок
Да в том то и дело, что я создал документ *.csv, который при просмотре в нотпаде отображается нормально... А при открытии экселом там полнейшая абра-кадабра..... Ты говоришь, что можно указать читающему софту кодировку. не подскажешь как???

в данный момент выглядит так.


Еще ты заикнулся о #&символах. Не подскажешь что именно из функций посмотреть, как получать код символа? Просто до этого НИКОГДА не было необходимости в такого рода задачах ;(
 

SiMM

Новичок
Автор оригинала: Мутник
Ты говоришь, что можно указать читающему софту кодировку.
Если вчитаешься внимательно, то поймёшь, что я этого не говорил. Нужно знать и можно - это всё же разные вещи. Кроме того, я дал понять, что никакой практики с csv у меня нет, т.е. подробности тебе расскажет либо кто-то другой, кто в этом разбирается, либо тебе их придётся выкапывать самостоятельно.
Еще ты заикнулся о #&символах. Не подскажешь что именно из функций посмотреть, как получать код символа?
Из функций - писать самому, а по поводу того, как получать код - я дал уже достаточно ссылок в предыдущих двух постах. И, опять же повторюсь - я не утверждаю, что это будет работать.

-~{}~ 20.01.05 10:10:

PS: из картинки видно, что csv-файл читается в кодировке Windows-1251 - это всё, что я могу сказать по этому поводу ;)
 

camka

не самка
while($row = читается очередной ряд из выборки)
$result[mb_substr($row['field'],0,1)][] = $row['field'];

-~{}~ 20.01.05 10:05:

ой.. а второй страницы дебатов я и не приметил
 

Мутник

Новичок
2 Самка:

не работает, уже давно пробовал! о существовании mb_**** я знаю - не совсем всегда помогает!
 
Сверху