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;
Другие вопросы по тегам