gpt4 book ai didi

perl - Mason2错误的utf8编码与 "go"方法

转载 作者:行者123 更新时间:2023-12-04 19:39:31 24 4
gpt4 key购买 nike

有点长的问题,因为 AFAIK Poet/Mason2 不是经常使用的框架 - 所以我试图详细说明。

两年前我asked a question如何使 Mason2 utf8 干净。据我所知,Mason/Poet 在这个领域并没有什么新东西——不幸的是,今天我遇到了另一个问题。简单测试用例:

$ 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,将获得正确的内容。

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 GROSSEN SYLTER DEICH.

但是当创建另一个组件时,说 go.mc with a content

% $m->go('/page');

内部重定向(go 方法)有些困惑内容并会产生:

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 GROSSEN SYLTER DEICH.

奇怪,$m->visit() 工作正常。所以,在 Poet/Mason 的某个地方需要做一些事情来为 go 方法获得正确的输出。

有人能帮忙吗?

最佳答案

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

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

关于perl - Mason2错误的utf8编码与 "go"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27806684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com