有点长问题,因为AFAIK Poet / Mason2不是经常使用的框架 - 所以我试图详细说明。
两年前我asked a question如何让Mason2 utf8干净。据我所知,这个领域的梅森/诗人并没有什么新鲜事 - 不幸的是,今天我遇到了另一个问题。简单的测试用例:
$ poet new my #create new poet application
$ cd my
覆盖一些方法,允许在组件中使用utf8:
添加到./lib/My/Mason/Compilation.pm
override 'output_class_header' => sub {
return join("\n",
super(), qq(
use utf8;
use Encode qw(encode decode);
)
);
};
上面为每个编译的Mason组件添加了use utf8...
。
还需要对Mason的输出进行编码(Plack需要字节),所以在:./lib/My/Mason/Request.pm
override 'run' => sub {
my($self, $path, $args) = @_;
my $result = super();
$result->output( Encode::encode('UTF-8', $result->output()) );
return $result;
};
现在,可以创建一个page.mc
组件,例如内容:
% sub { uc($_[0]) } {{
a quick brown fox jumps over the lazy dog.
διαφυλάξτε γενικά τη ζωή σας από βαθειά ψυχικά τραύματα.
árvíztűrő tükörfúrógép.
dość gróźb fuzją, klnę, pych i małżeństw!
эх, чужак, общий съём цен шляп (юфть) – вдрызг!
kŕdeľ šťastných ďatľov učí pri ústí váhu mĺkveho koňa obhrýzať kôru a žrať čerstvé mäso.
zwölf boxkämpfer jagen viktor quer über den großen sylter deich.
% }}
运行诗人应用bin/run.pl
后,您可以转到:http://0:5000/page
并获得正确的内容。
一只快速的棕色狐狸在懒散的狗身上跳动。 ΔΙΑΦΥΛΆΞΕΕΕΙΙΙΚΆΤΗΖΩΉ ΣΑΣΑΠΌΒΑΘΕΙΆΨΥΧΙΚΆΤΡΑΎΜΑΤΑ。 ÁRVÍZTŰRŐTÜKÖRFÚRÓGÉP。 DOŚĆGRÓŹB FUZJĄ,KLNĘ,PYCH我MAŁŻEŃSTW! ЭХ,ЧУЖАК,ОБЩИЙСЪЁМЦЕНШЛЯП(ЮФТЬ) - ВДРЫЗГ! KŔDEĽŠŤASTNÝCHĎATĽOVUČÍPRIÚSTÍVÁHUMĹKVEHOKOŇAOBHRÝZAŤ KÔRUAŽRAŤČERSTVÉMÄSO。 ZWÖLFBOXKÄMPFERJAGENVIKTORQUERÜBERDEN GROSSEN SYLTER DEICH。
但是在创建另一个组件时,请说出go.mc
的内容
% $m->go('/page');
内部重定向(go
方法)有点搞乱内容并将产生:
一只快速的棕色狐狸在懒散的狗身上跳动。 ÎÎÎÎ|Î¥ÎÎÎΤΠÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎÎΠΤΡÎÎÎÎΤÎ。 ÃRVÃZTÅ°RÅTÃKÃRFÃRÃGÃP。 DOÅÄGRÃŹB FUZJÄ,KLNÄ,PYCHIMAÅÅ»EÅSTW! ÐÐ¥,ЧУÐÐÐ,ÐÐЩÐРСЪÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐÐ~~~~ KÅ德国 ŤASTNÃCHÄATĽOVUÄÃPRIÃSTÃVÃHUMĹKVEHOKOÅAOBHRÃZAŤ KÃRUAŽRAŤÄERSTVÃMÃSO。 ZWÃLFBOXKÃMPFERJAGENVIKTOR QUER ÃBERDENGROSSEN SYLTER DEICH。
奇怪,$m->visit()
正常工作。因此,Poet / Mason中的某个地方需要做一些事情才能获得go
方法的正确输出。
有人可以帮忙吗?
答案 0 :(得分:2)
我一直在为Mason设计一个处理编码的插件。 $result->output
是编码输出的错误位置,因为visit
将在返回原始组件之前运行子请求,在末尾编码自己的内容,然后在完成时重新编码所有内容。因此visit
中的内容会被编码两次。我很惊讶你遇到go
的问题,因为它会丢弃所有以前的内容并重新开始,这应该没问题。