Perl URI кодирует нелатинские символы - PullRequest
0 голосов
/ 20 декабря 2011

Я использую perl для ajax (метод POST), и когда я читаю POST-запрос с помощью приведенного ниже сценария, я получаю URI-кодированный запрос.

Пример: отправлено - привет, получено:% 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 Ответ

3 голосов
/ 20 декабря 2011

Ну, это не специфично для 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...