Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Как сформировать запрос?


Автор: s_a_s_h_a 19.8.2004, 15:08
Люди, подскажите, пожалуйста, как вручную корректно сформировать запрос, что-то типа:

http://site.ru?name=%D2%E5%F1%F2%EE%E2%E0%FF&age=12

В общем, чтобы русские символы передавать нормально.

Автор: GoodBoy 19.8.2004, 15:15
используй функцию ord - она возвращает код символа

Автор: Secandr 19.8.2004, 15:28
а потом полученое число в 16 виде представить.

Автор: s_a_s_h_a 19.8.2004, 15:32
Это совсем неинтересно. Во первых, эта функция возвращает код только первого символа выражения, а во вторых, его еще надо преобразовывать в 16-ый код. И у меня много русского текста будет в запросе.

Я пытался следующим образом сделать:

my $q = new CGI;

for(my $i=0;$i<scalar(@FIELD_NAMES);$i++)
{ $q->param(-name =>$FIELD_NAMES[$i], -value => $VALUES[$i]);
}

$QUERY=$q->query_string;

но переменная $QUERY принимала значение равное $ENV{QUERY_STRING}.

Не понятно.....

Добавлено @ 15:37
Мне бы что-нибудь обратное такой вот функции:

sub urldecode{
local($val)=@_;
$val=~s/\+/ /g;
$val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge;
return $val;
}

Идея! Сейчас попробую все местами поменять. Может получится.

Автор: GoodBoy 19.8.2004, 15:43
Цитата(s_a_s_h_a @ 19.8.2004, 16:32)
Это совсем неинтересно. Во первых, эта функция возвращает код только первого символа выражения, а во вторых, его еще надо преобразовывать в 16-ый код

А что тебе мешает сделать что-нить типа:
Код
my $string = 'оылра полфырваплфоыр пфлоырвпаэ';
my $result = '';
$result .= '%'.hex(ord($symb)) for my $symb (split(//, $string));

Автор: s_a_s_h_a 19.8.2004, 15:57
GoodBoy, ты пробовал, то что написал?
Просто функция hex выражение воспринимает выражение как строку шестнадцатеричных цифр и возвращает десятичное значение.

Мне надо антиhex.

Автор: GoodBoy 19.8.2004, 16:12
да, немного не то написал... Вот так надо:

Код
my $string = 'Аоылра полфырваплфоыр пфлоырвпаэ';
my $result = '';
$result .= '%'.unpack("H2", $_) for (split(//, $string));

Автор: s_a_s_h_a 19.8.2004, 16:34
Спасибо, GoodBoy.
Я уже пытался запаковать это дело, но у меня естественно ничего не получалось, т.к. использовал функцию pack.

Правда, если кто-то использует функцию декодирования запроса, которую я приводил ранее, то он раскодировать запрос, полученный твоим способом не сможет. Ему надо будет внести маленькую поправочку:

$val=~s/%([0-9A-Ha-h]{2})/pack('C',hex($1))/ge;

Тогда все будет замечательно. Спасибо.

Автор: GoodBoy 19.8.2004, 16:40
я бы посоветовал вместо
Код
$val=~s/%([0-9A-Ha-h]{2})/pack('C',hex($1))/ge;

использовать
Код
$val=~s/%([0-9a-h]{2})/pack('C',hex($1))/gei;

(буква i в конце) и тогда тоже все будет великолепно!!!! :-)))))))))))

Добавлено @ 16:41
ой... какое-то пидарское окончание у строки получилось... :-))))))))))))))))))

Автор: ElectricalStorm 19.8.2004, 19:15
Код

$val=~s/%([0-9a-h]{2})/pack('C',hex($1))/;


что такое h ??
mb [0-9A-Fa-f]{2} ?

Автор: s_a_s_h_a 20.8.2004, 08:53
ElectricalStorm, действительно два лишних символа. Просто кто-то ранее опечатался и теперь везде (т.е. во многих книжках и на тех страницах, где я видел пример функции urldecode) пишут [0-9A-H]. Это работает, поэтому мало кто замечает, что вместо H можно F поставить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)