Mason2使用“go”方法错误地使用utf8编码

时间:2015-01-06 20:28:32

标签: perl mason

有点长问题,因为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方法的正确输出。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

我一直在为Mason设计一个处理编码的插件。 $result->output是编码输出的错误位置,因为visit将在返回原始组件之前运行子请求,在末尾编码自己的内容,然后在完成时重新编码所有内容。因此visit中的内容会被编码两次。我很惊讶你遇到go的问题,因为它会丢弃所有以前的内容并重新开始,这应该没问题。

查看https://github.com/davebaird/mason-plugin-withencoding