Perl URIencodes非拉丁字符

时间:2011-12-20 17:39:04

标签: perl post

我使用perl进行ajax(POST方法),当我用下面的脚本读取POST查询时,我得到了我的查询URIencoded。

示例:已发送 - привет,已收到:%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82

拉丁语查询效果很好。脚本只是在某个地方用Google搜索。

脚本:

sub populatePostFields {
    %_POST = ();
    read( STDIN, $tmpStr, $ENV{ "CONTENT_LENGTH" } );
    @parts = split( /\&/, $tmpStr );
    foreach $part (@parts) {
        ( $name, $value ) = split( /\=/, $part );
        $value =~ ( s/%23/\#/g );
        $value =~ ( s/%2F/\//g );
        $_POST{ "$name" } = $value;
    }
}

1 个答案:

答案 0 :(得分:3)

嗯,这不是特定于Perl的。发送时,Web浏览器需要对值进行URI编码。

您可以使用标准use CGI模块为您解码表单字段 - 这是绝对值得推荐的,因为它会为您处理各种边缘情况,并且如果您决定转换为一个mod_perl模块。

如果您正在运行CGI脚本,我也强烈建议您-T行(shebang)和{{1} #!/usr/bin/perl -T帮助捕获可能在网络上容易被利用的东西。

use strict;

     #!/usr/bin/perl -T
     use strict;
     use CGI;

     my $q = CGI->new;

     print "Content-Type: text/html\n\n";

     print "<html><body><h1> Field FOO contains: ", $q->param('FOO'),
           "</h1></body></html>\n\n";

您可以使用 <html><body><h1> Field FOO contains: привет </h1></body></html> 字符串 ->param(来阅读各种表单字段;它将透明地处理GET和POST,并为您解码URI编码的字符串。

“不推荐的,艰难的方法”是使用表达式:

)