журнал доступа к плакетке - локаль и открытая прагма - проблема кодирования - PullRequest
2 голосов
/ 24 июля 2011

Мой языковой стандарт - utf8, поэтому при запуске набора строк строки также локализуются.Поэтому я получаю консольный журнал доступа, подобный следующему:

$ plackup a.psgi 
HTTP::Server::PSGI: Accepting connections at http://0:5000/
127.0.0.1 - - [24/júl/2011:12:15:44 +0200] "GET / HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7) AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1 Safari/534.48.3"
                   ^- garbage

мой частичный a.psgi:

use 5.014;
use warnings;
use utf8;
use open qw(:std :utf8); #the problem....
use Encode;

use Plack::Builder;

use MyApp;
my $runner = MyApp->new(...);
my $app = sub {
    $runner->run(shift);
};

builder {$app;};

Проблемная строка - open pragma.(Мне нужна открытая прагма в MyApp).Без него журнал доступа правильно печатает Júl, с ним в журнал доступа попадают мусоры.

Итак, как исправить мой журнал доступа?

  • для любого без мусорараспечатки локализованных строк дат или
  • преобразование сообщений журнала доступа в C-locale

Есть идеи?

Ps: я знаю, чем PSGIявляется байт-ориентированной спецификацией (и MyApp правильно обрабатывает ее), но эта проблема находится за пределами MyApp.

1 Ответ

2 голосов
/ 24 июля 2011

Я думаю, что ваша open прагма слишком широка. Вы говорите, что вам это нужно, но не назвали детали. Вы должны иметь возможность ограничить его только теми потоками, которые вы используете явно.

Если это слишком сложно понять, просто выровняйте слой IO для потока STDERR, куда идут сообщения журнала:

binmode STDERR, ':bytes';
...