我昨天升级了 Debian stable 并使用“新”Perl 5.14 我也得到了“新”CGI 模块(v3.52)。我认为以前的版本是 3.43。升级破坏了我的旧网络表单,我发现来自 enctype "application/x-www-form-urlencoded" 表单字段的 UTF-8 字符被解码两次。虽然使用 enctype "multipart/form-data" 一切正常。
问题:
- 为什么“application/x-www-form-urlencoded”表单中的 UTF-8 处理不正确?即使“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 解码。似乎升级后自动生成的表单的编码类型错误(“application/x-www-form-urlencoded”),因为使用了不推荐使用的辅助方法(例如startform
,相反start_form
)。