2011-12-20 249 views
-3

我使用perl for ajax(POST方法),并且当我使用下面的脚本读取POST查询时,我得到了我的查询URIencoded。Perl URIencodes非拉丁字符

实施例:发送 - привет,接收:%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82

拉丁查询工作良好。脚本只是在某处搜索到的。

脚本:

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; 
    } 
} 
+5

对了,?问题是什么? – CanSpice 2011-12-20 17:52:39

回答

3

好吧,这不是Perl的具体。在发送时,Web浏览器需要对这些值进行URI编码。

您可以使用标准的use CGI模块为您解码表单字段 - 这是绝对推荐,因为它会照顾各种边缘的情况下对你,也是可以使用的,如果你决定要转换为mod_perl模块后来。

如果你正在运行一个CGI脚本,我也强烈建议您有-Tshebang线(#!/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编码的字符串。

的“不推荐的,艰辛的道路”是使用表达式:

 my ($name, $value) = split /\=/, $part; 
     $value =~ s/\+/ /g; 
     $value =~ s/(\%[0-9a-fA-F][0-9a-fA-F])/ (chr (hex $1)) /gex; 
+0

谢谢!它有帮助,但我还有一个问题:如果我使用print(),但die()返回iso-5589字符集中的页面,它就可以正常工作。可以设置die()的编码吗? – ProdoElmit 2011-12-20 18:34:57

+0

未经测试,但我相信*你可以做两件事;首先,确保你的头文件具有'Content-Type:text/html;字符集= UTF-8';其次,设置'binmode STDOUT',':utf8';'...根据你的'死'处理程序,结果可能会有所不同。 (请参阅CPAN的'CGI :: Carp',这是将异常转储到浏览器的好方法) – BRFennPocock 2011-12-20 19:03:02