Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
utf-8, case insensitive, slocate и strcasestr
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Russian
View previous topic :: View next topic  
Author Message
user11
Tux's lil' helper
Tux's lil' helper


Joined: 25 Nov 2005
Posts: 149

PostPosted: Sat Dec 15, 2007 10:15 pm    Post subject: utf-8, case insensitive, slocate и strcasestr Reply with quote

Уже год как работаю на LANG=ru_RU.UTF-8. Перешёл с koi8-r по тому соображению, что теперь это считается "правильной" кодировкой. Правда, ряд мелких глюков всё равно остался, ну да ладно.

Но что меня сегодня поразило, наверное, наповал - это то, что `locate -i Проба`и `locate -i проба` выдают разные результаты. После этого, немного поковырявшись, понял, что, по-видимому, slocate использует strcasestr (если только определён FNM_CASEFOLD, а он определён) и написал тестик:

Code:

$ cat test.cpp
#include <stdio.h>
#include <fnmatch.h>
#include <string.h>
int main() {
        printf("%d\n",(int)FNM_CASEFOLD);
        printf("привет: %p\n",strcasestr("привет","ПРИВЕТ"));
        printf("hello: %p\n",strcasestr("hello","HELLO"));
        return 0;
}
$ ./test
16
привет: (nil)
hello: 0x804867e

И это при том, что:
Code:

$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC=POSIX
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES=POSIX
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
$ locale -a |grep ru_RU
ru_RU
ru_RU.koi8r
ru_RU.utf8
$ emerge -pv glibc
...
[ebuild   R   ] sys-libs/glibc-2.6.1  USE="nls -debug -gd -glibc-omitfp (-hardened) (-multilib) -profile (-selinux) -vanilla" 0 kB


Почитав glibc-2.6.1.tar.bz2/string/strcasestr.c, с горечью обнаружил вызовы типа TOLOWER(char)...

Что ж, выходит, strcasestr - это какой-то устаревший (deprecated) вызов?
Чем же пользоваться вместо него? Нужно всего-то сравнить две строчки в системной локали без учёта регистра.

Удивила меня и homepage slocate'а. Вообще, она ли это? http://www.geekreview.org/slocate/

Мне всё больше начинает казаться, что utf-8 - это зло. Оно создаёт видимость работоспособности там, где её нет.

PS. Я *не* linux-программист. Просто я хочу, чтобы оно работало.
Back to top
View user's profile Send private message
Laitr Keiows
Moderator
Moderator


Joined: 04 Jul 2005
Posts: 891
Location: Kobe, Japan

PostPosted: Tue Dec 18, 2007 4:06 am    Post subject: Reply with quote

1) Версия какая?
2) Домашняя страница вот: http://slocate.trakker.ca/
Back to top
View user's profile Send private message
user11
Tux's lil' helper
Tux's lil' helper


Joined: 25 Nov 2005
Posts: 149

PostPosted: Tue Dec 18, 2007 6:23 am    Post subject: Reply with quote

Спасибо за ссылку.
На момент написания первого сообщения было sys-apps/slocate-2.7-r8 ("Secure Locate 2.7 - Released January 24, 2003").
Сейчас (почитав homepage) обновился до sys-apps/slocate-3.1-r1 ("Secure Locate 3.1 - Released March 7, 2006") - симптомы сохранились. В сорцах вызов strcasestr(), на первый взгляд, на том же месте.
Back to top
View user's profile Send private message
Laitr Keiows
Moderator
Moderator


Joined: 04 Jul 2005
Posts: 891
Location: Kobe, Japan

PostPosted: Tue Dec 18, 2007 6:31 am    Post subject: Reply with quote

user11 wrote:
В сорцах вызов strcasestr(), на первый взгляд, на том же месте.

Тогда есть как минимум два варианта:
1) Поправить самому и отправить патч разработчику
2) Попросить разработчика исправить :)

Лучше по 1-му пути... К сожалению больше ничего толкового не посоветую :(
Back to top
View user's profile Send private message
user11
Tux's lil' helper
Tux's lil' helper


Joined: 25 Nov 2005
Posts: 149

PostPosted: Tue Dec 18, 2007 11:07 pm    Post subject: Reply with quote

В документации к glibc написано, что strcasestr "is locale dependent how uppercase and lowercase characters are related".
Вроде, про utf-8 столько разговоров, что "должна бы поддерживаться". Ан нет. koi8-r поддерживается, а utf-8 - нет (да и не может с таким кодом).

Пока что копания дали только http://mail.nl.linux.org/linux-utf8/2004-12/msg00007.html
и, за последние 3 года, в этой рассылке не нашлось ничего ближе.

Так что пока остаётся двигаться в направлении проблем glibc, а не slocate. (вряд ли разработчики slocate захотят видеть костыли типа "если кодировка utf-8, то перед сравнением преобразуем строчки к wchar").
Back to top
View user's profile Send private message
user11
Tux's lil' helper
Tux's lil' helper


Joined: 25 Nov 2005
Posts: 149

PostPosted: Fri Jan 04, 2008 10:34 pm    Post subject: Reply with quote

Как постить в рассылку linux-utf8, я так и не нашёл, хотя, вроде, удалось на него подписаться. Видимо, не дорос, чтобы "с серьёзными людьми разговаривать" :)

Зато обнаружил, что, в отличие от slocate, grep -i в UTF-8 локали работает правильно (...если только не указана опция -P).

Но обнаружил это уже в совершенно другой ситуации, пытался понять, отчего у меня этот самый grep жутко тормозит, когда что-то находит (без -i; при поиске ASCII-текста). Для сравнения, perl -ne "print if m/blablabla/;" работает иногда на два порядка быстрее. Надо отметить, что при LANG=ru_RU.koi8-r grep *НЕ* тормозит, и работает (как и должно бы быть) даже на порядок быстрее примера с перловым regexp'ом. Поэтому не хотелось бы переделывать код slocate по образу grep'а.

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

PS. Можно ли использовать линукс с utf-8? Да, можно. Но, вероятно, не стоит ;-)
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Russian All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum