> Этот скрипт из консоли выдает "Yes!", а как cgi, из-под Apache, то "No!"
>
> #!/usr/bin/perl -w
>
> use POSIX qw(locale_h);
> use strict;
>
> $ENV{LANG}='ru_RU.KOI8'; #это все от безысходности :(
> $ENV{LC_ALL}='ru_RU.KOI8';
> $ENV{LC_CTYPE}='ru_RU.KOI8';
> setlocale(LC_ALL,'ru_RU.KOI8');
> setlocale(LC_CTYPE,'ru_RU.KOI8');
> use locale;
>
> $a='ляляля';
>
> print "Content-type: text/plain\n\n";
>
> if($a=~/\w+/) { print "Yes!\n"; }
> else { print "No!\n"; }
>
> #конец.
>
> Причем неважно, под mod_perl или под чистым perl.
> Почему?
А какая система?? Я, кроме как на Irix-e, ни где не встречал такую
locale как 'ru_RU.KOI8'? Это первое.
Второе, 'use locale;' так же вызывает setlocale, используя
environment, но, как я понимаю, не из $ENV - это только его копия.
Поэтому, ставить 'use locale;' после setlocale вредно.
Я думаю, если вы в шеле удалите LC_* и LANG, то получите результат
аналогичный cgi.
Это хорошо показывает: print `locale`;
Кстати, $ENV переходит к потомкам!!! Вообщем, это их окружение.
Исходя из сказаного:
#!/usr/bin/perl -w
use locale;
use POSIX qw(locale_h);
$lang='ru_RU.KOI8-R' # уточнить в /usr/{share,lib}/locale/
setlocale(LC_CTYPE,$lang);
setlocale(LC_COLLATE,$lang);
# Если будут потомки:
$ENV{LC_CTYPE}=$lang;
$ENV{LC_COLLATE}=$lang;
...
--
С наилучшими пожеланиями, Евгений Бырганов.
Best regards, Eugene Byrganov.
mailto:E.B.Byrganov@xxxxxxxxxx
work - http://www.inp.nsk.su/
=============================================================================
= Apache-Talk@xxxxxxxxxxxxx mailing list =
Mail "unsubscribe apache-talk" to majordomo@xxxxxxxxxxxxx if you want to quit.
= Archive avaliable at http://www.lexa.ru/apache-talk =
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE.
Copyright (C) 1995-2001 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C)
1997-2009 Alex Tutubalin. Design (C) 1998 Max Smolev.