我昨天升级了Debian,并使用" new" Perl 5.14我得到了新的" CGI模块(v3.52)。我认为之前的版本是3.43。升级破坏了我的旧webforms,我发现UTF-8字符来自表单字段,其中包含enctype" application / x-www-form-urlencoded"得到解码两次。使用enctype" multipart / form-data"一切正常。
问题:
这是解决解码问题的小测试用例:
#!/usr/bin/perl
use strict;
use warnings;
use utf8::all;
use CGI qw(:all -utf8);
my $q = new CGI;
sub build_form {
return q|
<form method="post" enctype="application/x-www-form-urlencoded">
<br />
Y: <input type="text" name="y" />
</form>|;
}
print $q->header( -type=>"text/html; charset=utf-8", ),
$q->start_html( -title=>"test", -encoding=>"utf-8" ),
$q->h1( $q->param( 'x' ) . " " ),
$q->start_form(),
"X: ",
$q->textfield( -name=>'x' ),
$q->end_form(), "\n\n",
$q->br(),
$q->h1( $q->param( 'y' ) . " " ),
build_form(),
$q->end_html;
PS。我不认为升级破坏了UTF-8解码。似乎升级后自动生成的表单具有错误的enctype(&#34; application / x-www-form-urlencoded&#34;)因为使用了弃用的辅助方法(例如startform
而不是start_form
)。 / p>
答案 0 :(得分:4)
use utf8::all;
确实
binmode(STDIN, ':encoding(UTF-8)');
会破坏浏览器发送的数据。跟进
binmode(STDIN);
撤消更改并防止损坏。