Я хочу опубликовать русский текст на сайте CP1251 с помощью LWP :: UserAgent и получить следующие результаты:
# $text="Русский текст"; obtained from command line
FIELD_NAME => $text # result: Г?в г'В?г'В?г'В?г?вєг?вёг?в? Г'В'Г?вчг?вєг'В?г'В'
$text=Encode::decode_utf8($text);
FIELD_NAME => $text # result: Р с?с?с?рєрёр? С'Рчрєс?с'
FIELD_NAME => Encode::encode("cp1251", $text) # result: Г?гіг+г+гЄгёгЏ ГІгҐгЄг+гІ
FIELD_NAME => URI::Escape::uri_escape_utf8($text) # result: D0%a0%d1%83%d1%81%d1%81%d0%ba%d0%b8%d0%b9%20%d1%82%d0%b5%d0%ba%d1%81%d1%82
Как я могу это сделать? Тип содержимого должен быть x-www-form-urlencoded
. Вы можете найти похожую форму здесь , но там вы можете просто экранировать любой нелатинский символ, используя & # ...; форма, попытка экранировать ее в FIELD_NAME
приводит к 10561091108910891 10901077108210891
(каждые &
, #
и ;
извлекаются из строки) или 1056;усский текст
(знаки препинания в начале строки удаляются ) в зависимости от того, что на самом деле FIELD_NAME
.
ОБНОВЛЕНИЕ : Кто-нибудь знает, как преобразовать следующий код, чтобы он использовал функцию LWP :: UserAgent :: post?
my $url=shift;
my $fields=shift;
my $request=HTTP::Request->new(POST => absURL($url));
$request->content_type('application/x-www-form-urlencoded');
$request->content_encoding("UTF-8");
$ua->prepare_request($request);
my $content="";
for my $k (keys %$fields) {
$content.="&" if($content ne "");
my $c=$fields->{$k};
eval {$c=Encode::decode_utf8($c)};
$c=Encode::encode("cp1251", $c, Encode::FB_HTMLCREF);
$content.="$k=".URI::Escape::uri_escape($c);
}
$request->content($content);
my $response=$ua->simple_request($request);
Этот код фактически решает проблему, но я не хочу добавлять третью функцию-оболочку запроса (наряду с get
и post
).