Вот такая проблема при попытке запуска perl-сайта на mason.Гугл говорит, что нужно ставить binmode, однако на дебиане все работает прекрасно, а тут переезжаем на centos.
Гуру, подскажите, что за нафиг.
Полностью ошибка:
Wide character in FCGI::Stream::PRINT at /usr/local/lib/perl5/site_perl/5.10.1/HTML/Mason/CGIHandler.pm line 105.
>Вот такая проблема при попытке запуска perl-сайта на mason.
>
>Гугл говорит, что нужно ставить binmode, однако на дебиане все работает прекрасно,
>а тут переезжаем на centos.
>
>Гуру, подскажите, что за нафиг.
>
>Полностью ошибка:
>Wide character in FCGI::Stream::PRINT at /usr/local/lib/perl5/site_perl/5.10.1/HTML/Mason/CGIHandler.pm line 105.думаю что mason новый а модули CentOS для него в дистрибутиве старые -- см. рекомендуемые компоненты на движок
Чего-то проапдейтил все модули, и нифига
>Wide character in FCGI::Stream::PRINT at /usr/local/lib/perl5/site_perl/5.10.1/HTML/Mason/CGIHandler.pm line 105.А что, если добавить в CGIHandler.pm такие строчики?
use open ':utf8';
use encoding 'utf8';
>Вот такая проблема при попытке запуска perl-сайта на mason.
>
>Гугл говорит, что нужно ставить binmode, однако на дебиане все работает прекрасно,
>а тут переезжаем на centos.
>
>Гуру, подскажите, что за нафиг.
>
>Полностью ошибка:
>Wide character in FCGI::Stream::PRINT at /usr/local/lib/perl5/site_perl/5.10.1/HTML/Mason/CGIHandler.pm line 105.Та-же проблема на Centos 5.2, perl 5.10.1, при print в FCGI приложении.
binmode STDOUT в FCGI враппере не помогает.
Тот-же код под apache работает корректно.
>>Полностью ошибка:
>>Wide character in FCGI::Stream::PRINT at /usr/local/lib/perl5/site_perl/5.10.1/HTML/Mason/CGIHandler.pm line 105.Это error или warning?
>Та-же проблема на Centos 5.2, perl 5.10.1, при print в FCGI приложении.Имхо, без fcgi было бы в логах то же самое.
Сталкивался с таким. Общего решения не нашел, но иногда работало
no warnings 'utf8';
...пишу по давней памяти и на неспавшую голову, мог и ошибиться в синтаксисе.
>Тот-же код под apache работает корректно.эммм, а под чем работает некорректно?
>[оверквотинг удален]
>Имхо, без fcgi было бы в логах то же самое.
>Сталкивался с таким. Общего решения не нашел, но иногда работало
>no warnings 'utf8';
>...пишу по давней памяти и на неспавшую голову, мог и ошибиться в
>синтаксисе.
>
>
>>Тот-же код под apache работает корректно.
>
>эммм, а под чем работает некорректно?Корректно работает как CGI приложение под Apache.
Некорректно, когда самостоятельный FCGI демон.
# cat nginx_error.log
2010/03/19 11:13:53 [error] 24091#0: *1 FastCGI sent in stderr: "FCGI application error: Wide character in FCGI::Stream::PRINT at /var/www/pharaoh/Pharaoh/HTTP/Controller/Index.pm line 60" while reading response header from upstream, client: 95.132.240.254, server: wmstar.com.ua, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9012"При этом FCGI в STDOUT ничего не возвращает, клиент получает пустую страницу.
>>[оверквотинг удален]
>>Имхо, без fcgi было бы в логах то же самое.
>>Сталкивался с таким. Общего решения не нашел, но иногда работало
>>no warnings 'utf8';Не помогает.
>[оверквотинг удален]
>
>Некорректно, когда самостоятельный FCGI демон.
># cat nginx_error.log
>2010/03/19 11:13:53 [error] 24091#0: *1 FastCGI sent in stderr: "FCGI application error:
>Wide character in FCGI::Stream::PRINT at /var/www/pharaoh/Pharaoh/HTTP/Controller/Index.pm line 60" while reading response
>header from upstream, client: 95.132.240.254, server: wmstar.com.ua, request: "GET / HTTP/1.1",
>upstream: "fastcgi://127.0.0.1:9012"
>
>При этом FCGI в STDOUT ничего не возвращает, клиент получает пустую страницу.
>
Resolved / РешеноДело в том, что в модуле FCGI 0.69 произведены некоторые изменения в логике работы, без поддержки ошибочных старых вариантов. Они считают, что раньше программы функционировали неправильно.
Нехорошо они поступили в смысле поддержки уже написаных решений, да бог им судья.
Дружно откатываемся на FCGI 0.68 и проблема решена.
>Resolved / Решено
>
>Дело в том, что в модуле FCGI 0.69 произведены некоторые изменения в
>логике работы, без поддержки ошибочных старых вариантов. Они считают, что раньше
>программы функционировали неправильно.
>
>Нехорошо они поступили в смысле поддержки уже написаных решений, да бог им
>судья.
>
>Дружно откатываемся на FCGI 0.68 и проблема решена.Version 0.68_01 -- 10 Jan 2010 <mst@shadowcat.co.uk> Matt S Trout
o Force signal handler installation so that we correctly install handlers
for SIGPIPE. Fixes RT#5100 <bobtfish@bobtfish.net>
o Make the PRINT method return the number of bytes written rather than
undef to be consistent with the IO:: interface. Fixes RT#24347
<David Dick>
o Fix UTF-8 double encoding when FCGI is passed octets by downgrading
them into bytes correctly. Fixes RT#52400 <chansen@cpan.org>В исходниках FCGI::XL добавилась следующая конструкция в методах PRINT и WRITE:
#ifdef DO_UTF8
if (DO_UTF8(ST(n)) && !sv_utf8_downgrade(ST(n), 1))
croak("Wide character in FCGI::Stream::PRINT");
#endifМожет кто-то растолковать, что она делает?
В конечном итоге интересует, как все-же выводить контент в UTF-8 используя последние версии FCGI? У меня модули апдейтятся автоматически из CPAN (cpan upgrade).
>Может кто-то растолковать, что она делает?
>
>В конечном итоге интересует, как все-же выводить контент в UTF-8 используя последние
>версии FCGI? У меня модули апдейтятся автоматически из CPAN (cpan upgrade).Цитата из https://rt.cpan.org/Public/Bug/Display.html?id=54247
You are trying to output perl's internal UTF-X format, since it contains
code points above 0xFF (0x100) it can't be downgraded (utf8_downgrade).use encoding 'utf8'; has no effect on FCGI.XS since it's using TIEHANDLE
> This simple code produce an error:
>
> Wide character in FCGI::Stream::PRINT at ./fcgi2.pl line 16.Yeah, so your code was broken before, but it's now showing up as FCGI
started caring about doing the right thing, rather than just assuming
everything is bytes.You need to encode your output correctly if you're using non ascii...
На откат не решился. Поменял код так с:
print $template->output;на:
my $out = $template->output;
if (FCGI->VERSION > 0.68) {
utf8::encode($out)
}
print $outУдачи =)
> На откат не решился. Поменял код так с:
> print $template->output;
> на:
> my $out = $template->output;
> if (FCGI->VERSION > 0.68) {
> utf8::encode($out)
> }
> print $out
> Удачи =)Прошло 5 лет а воз и ныне там ...
так же можно использовать модуль Encode, что напрямую рекомендуют в документации
print Encode::encode_utf8($template->output);
> Прошло 5 лет а воз и ныне там ...
> так же можно использовать модуль Encode, что напрямую рекомендуют в документации
> print Encode::encode_utf8($template->output);И еще пару лет прошло...
Чтобы убрать ворнинги "Use of wide characters in FCGI::Stream::PRINT" использую Encode::encode_utf8( $content )