Perl URIencodes нелатинские символы
Я использую Perl для ajax (метод POST), и когда я читаю POST-запрос с помощью скрипта ниже, я получаю URIencoded мой запрос.
Пример: отправлено - привет, получено: %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;
}
}
1 ответ
Ну, это не специфично для Perl. Веб-браузер необходим для 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;