URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 8
[ Назад ]

Исходное сообщение
"Сортировка по алфавиту в CGI скрипте на Perl."

Отправлено lev , 26-Мрт-01 17:46 
use POSIX qw(locale_h);
$old_locale = setlocale(LC_CTYPE,"ru_KOI8R");

@values = sort { $labels{$a} cmp $labels{$b} } keys %labels;

Но в кодировке KOI8R буквы "Ф" и "Х" стоят не по алфавиту.
Подскажите как решить проблему.


Содержание

Сообщения в этом обсуждении
"RE: Сортировка по алфавиту в CGI скрипте на Perl."
Отправлено Sergey Vlasov , 27-Мрт-01 23:20 
Быстрое решение: use locale;

Правильное решение: man perllocale :-)


"RE: Сортировка по алфавиту в CGI скрипте на Perl."
Отправлено lev , 28-Мрт-01 21:04 
Правильное решение смотрел и раньше.
При повторном просмотре правильного решения обнаружил, что на сортировку влияет параметр LC_COLLATE или LC_ALL.
Но как и раньше буквы "Ф" и "Х" сортируются не в алфавитном порядке.
Числовые коды этих букв меньше чем должны быть при правильном алфавитном порядке. А сортировка функцией "cmp" сравнивает числовые коды букв.
Для чешского языка на CPAN лежит библиотека функций работы с национальным алфавитом.
Может кто нибудь встречал что-то подобное для русского языка?

"RE: Сортировка по алфавиту в CGI скрипте на Perl."
Отправлено Sergey Vlasov , 31-Мрт-01 23:37 
А какая система, какая libc, какой Perl? Дело в том, что после use locale для сравнения используется strxfrm() (так говорит man perllocale из Perl 5.6.0), соответственно, за сравнение отвечает libc. Если локаль настроена неправильно, вот тогда и будут глюки. За дополнительной информацией можно сходить на http://www.sensi.org/~alec/locale/index.html, после чего придется разбираться и правильно настраивать.

"RE: Сортировка по алфавиту в CGI скрипте на Perl."
Отправлено lev , 02-Апр-01 16:50 
Спасибо за линк.

На локальной машине все заработало.
Проблема была в том, что ru_SU не является "alias" к ru_RU, ru_KOI8R и ru. А переменная окружения LC_ALL по умолчанию установлена в ru_SU.
Теперь буду выяснять как у провайдера настроина переменная LC_ALL.


"RE: Сортировка по алфавиту в CGI скрипте на Perl."
Отправлено Sergey Vlasov , 02-Апр-01 20:07 
Правильно, страна SU теперь съежилась до размеров Судана. :-)

Кстати, скорее всего LC_ALL у провайдера не стоит. Никаких проблем - делается:


use posix qw(locale_h);
foreach (grep {/^LC_/} keys %ENV) { delete $ENV{$_} }
$ENV{'LANG'} = 'ru_RU.KOI8-R'; # или как надо в той системе
setlocale(LC_ALL, "");

Рекомендация: ставить use locale только в том блоке, где это надо - иначе с -T будет проблемы.


"RE: Сортировка по алфавиту в CGI скрипте на Perl."
Отправлено lev , 04-Апр-01 14:28 
Еще раз большое спасибо за помощь.

Как только оживет провайдер, попробую твои рекомендации.