Автор Тема: Несовпадение кодировок для яндекса  (Прочитано 2929 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Satell

  • Губернский секретарь
  • **
  • Сообщений: 21
  • Репутация: 0
Несовпадение кодировок для яндекса
« : ПЭТРам 05, 2008, 02:06:37 pm »
из формы с текстовым полем name=word передаётся запрос для яндекса в скрипт обработчик, код ниже
но яндекс не понимает кодировку и говорит что запрос был пустой, похоже это происходит во время передачи формы на сервер, хотя
print $word; после передачи печатает слово правильно.

если раскаментить строчку #$word="грузовые перевозки";
то всё будет работать, где что нужно поменять, чтобы яндекс понимал слово переданное из формы, есть ли какие-нибудь функции для смены кодировок, подозреваю, что нужно перевести в кодировку utf-8, библиотека iconv на моём сервере похоже не стоит.


#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Request::Common;


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

if ($ENV{'REQUEST_METHOD'} eq 'GET') {
$query=$ENV{'QUERY_STRING'};
}
elsif($ENV{'REQUEST_METHOD'} eq 'POST'){
sysread(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}

@formfields=split(/&/,$query);
foreach(@formfields){
if(/^word=(.*)/){$word=&urldecode($1);}
}

print "Content-Type: text/html; charset=windows-1251\n\n";
print $word;


#$word="грузовые перевозки";
$ua=LWP::UserAgent->new or die; #создаем новый объект LWP::userAgent (браузер)

$h1 = new HTTP::Headers
Accept => 'application/vnd.ms-excel, application/msword, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-comet, */*',
User_Agent => 'testag',
Referer => 'http://ya.ru',
Accept-Language => 'ru',
Accept-Charset => 'iso-8859-1,*,utf-8,windows-1251';
$req1 = new HTTP::Request ('GET', 'http://www.yandex.ru/yandsearch?text='.$word, $h1);
$res=$ua->request($req1);



#проверяем был ли запрос удачен
$suc=$res->is_success;
if ($suc){
print $res->content;
}

код формы:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Запрос</title>
</head>

<body>
<form action="cgi-bin/tests.cgi" method="post">
<p align="left">

<p align="left">
  <input type="text" name="word" size="26"></p>
<p><input type="submit" value="Send">
</p>
</form>
</body>
</html>

Оффлайн usmanec

  • Коллежский регистратор
  • *
  • Сообщений: 10
  • Репутация: 0
Re: Несовпадение кодировок для яндекса
« Ответ #1 : ѕЪвпСам 30, 2008, 01:37:19 am »
все просто запрос передается в utf-8, да еще и кодирован, так как содержит недопустимые символы для УРЛ.
Предлагаю функции! Используем $word=utf8enc($word); после чего со спакойной душой отправляем яндексу.######################
sub win2utf {
   my $s = shift;
   if ( ord($s)>=192 and ord($s)<=239) { return chr(208).chr(ord($s)-48) }
   if ( ord($s)>=240 and ord($s)<=255) { return chr(209).chr(ord($s)-112)}
   if ($s eq "Ё") { return chr(208).chr(149) }
   if ($s eq "ё") { return chr(208).chr(181) }
   if ($s eq "Ъ") { return chr(208).chr(172) }
   if ($s eq "Ь") { return chr(208).chr(170) }
   if ($s eq "ъ") { return chr(208).chr(140) }
   if ($s eq "ь") { return chr(208).chr(138) }
   return $s;
   }

sub urlencode{
    my($v)=@_;
    $v=~s/([=\+&%\/\\\|\0-\x1f\x80-\xff])/sprintf("%%%02X",unpack('C',$1))/eg;
    $v=~s/ /\+/g;
    return $v;
    }

sub utf8enc{
    my($v)=@_;
    $v=~s/([\xC0-\xFF\xB8\xA8\xFA\xDA\xFC\xDC\xFA])/win2utf($1)/ge;
    $v=urlencode($v);
    return $v;
    }
############################

Чтобы перевести ответ яндекса в кодировку WIN используем $body=utf2win($res->content);
############################
# utf2win
sub utf2wins{
    my $s = shift;
    $s=~s/\xd1\x8c/\xfc/g;
    $s=~s/\xd1\x8a/\xfa/g;
    $s=~s/\xd0\xac/\xdc/g;
    $s=~s/\xd0\xaa/\xda/g;
    $s=~s/\xd1\x91/\xb8/g;
    $s=~s/\xd0\x81/\xa8/g;
    $s=~s/\xd0([\x90-\xbf])/chr(ord($1)+48)/eg;
    $s=~s/\xd1([\x80-\x8f])/chr(ord($1)+112)/eg;
    return $s;
    }

sub utf2win{
    my $v = shift;
    if($v=~/^\d\d\d\w\r?\n/){$v=~s/^\d\d\d\w\r?\n(.+)\r?\n0\r?\n\r?\n$/$1/s}
    elsif($v=~/^\xEF\xBB\xBF/){$v=~s/^\xEF\xBB\xBF//}
    $v=~s/([\xd0\xd1][\x80-\xbf])/&utf2wins($1)/eg;
    return $v;
    }
##################################