为什么CGI.pm在处理“application / x-www-form-urlencoded”表单时没有正确处理UTF-8?

时间:2013-09-09 09:49:48

标签: perl utf-8 cgi

我昨天升级了Debian,并使用" new" Perl 5.14我得到了新的" CGI模块(v3.52)。我认为之前的版本是3.43。升级破坏了我的旧webforms,我发现UTF-8字符来自表单字段,其中包含enctype" application / x-www-form-urlencoded"得到解码两次。使用enctype" multipart / form-data"一切正常。

问题:

  • 为什么UTF-8采用" application / x-www-form-urlencoded"处理不当?它们仍应正确解码,即使在" 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>

1 个答案:

答案 0 :(得分:4)

use utf8::all;

确实

binmode(STDIN, ':encoding(UTF-8)');

会破坏浏览器发送的数据。跟进

binmode(STDIN);

撤消更改并防止损坏。