4

我昨天升级了 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)。

4

1 回答 1

4
use utf8::all;

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

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

binmode(STDIN);

撤消更改并防止损坏。

于 2013-09-09T13:55:23.090 回答