Perl URIencodes非拉丁字符
我使用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;
}
}
好吧,这不是Perl的具体。在发送时,Web浏览器需要对这些值进行URI编码。
您可以使用标准的use CGI
模块为您解码表单字段 - 这是绝对推荐,因为它会照顾各种边缘的情况下对你,也是可以使用的,如果你决定要转换为mod_perl
模块后来。
如果你正在运行一个CGI脚本,我也强烈建议您有-T
对shebang
线(#!/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;
谢谢!它有帮助,但我还有一个问题:如果我使用print(),但die()返回iso-5589字符集中的页面,它就可以正常工作。可以设置die()的编码吗? – ProdoElmit 2011-12-20 18:34:57
未经测试,但我相信*你可以做两件事;首先,确保你的头文件具有'Content-Type:text/html;字符集= UTF-8';其次,设置'binmode STDOUT',':utf8';'...根据你的'死'处理程序,结果可能会有所不同。 (请参阅CPAN的'CGI :: Carp',这是将异常转储到浏览器的好方法) – BRFennPocock 2011-12-20 19:03:02
对了,?问题是什么? – CanSpice 2011-12-20 17:52:39