Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Несовпадение кодировок для яндекса 
:(
    Опции темы
Satell
Дата 5.1.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 28.6.2007

Репутация: нет
Всего: нет



из формы с текстовым полем 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>

PM MAIL   Вверх
nitr
Дата 5.1.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Надо сделать "валидный" урл smile Т.е. ваша ссылка не соответсвует стандарту smile
Это делает модуль URI::Escape, т.к. у вас кодировка windows-1251, то надо её в утф8 перевести smile

Для решения:

Satell, сделайте вот так
1) добавьте
Код

use URI::Escape 'uri_escape_utf8';
use Encode;

2) затем замените строку на эту
Код

$req1 = new HTTP::Request ('GET', 'http://www.yandex.ru/yandsearch?text='. uri_escape_utf8(Encode::decode('cp1251', $word)), $h1);




--------------------
PM   Вверх
Bulat
Дата 24.1.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Так в дополнение, сам в последнее время мучаюсь с проблемой кодировок и внимательно изучаю.

nitr, работа с модулем Encode хороший вариант. Только у меня стоит перл 5.8.6 и тут он начинает ругатся на недостаток каких-то модулей.

Более сложный, но самый верный вариант это заранее знать в какой кодировке загружаемая страница в браузере(как правило в utf-8), после чего получать исходный текст в текущей кодировке и пропускать через функцию uri_escape того же модуля URI::Escape. Способ не простой, но 100%.  И кстати, все же далеко не все сайты написаны в кодировке utf-8 smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
nitr
Дата 24.1.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



Bulat, у него для формирования запроса к поисковику Яндекса, это конкретика. А для парсинга страничек и т.п. вообще не эта тема, их кстати тоже очень много раз обсуждали, как и что парсить, обсуждали и автоопределение кодировок.

А в этой теме вообще не видно парсинга, у него ошибка в формировании ССЫЛКИ smile Я показал, как верно это сделать одним из простых способов.

P.S.: Если у вас проблема с модулем Encode, то можете создать тему smile поможем всем нашим небольшим, но "качественным" коллективом ;)


--------------------
PM   Вверх
Bulat
Дата 25.1.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

Репутация: 5
Всего: 57



Цитата(nitr @  24.1.2008,  22:33 Найти цитируемый пост)
Если у вас проблема с модулем Encode, то можете создать тему  поможем всем нашим небольшим, но "качественным" коллективом ;) 


Пасиба, я вообще-то научился решать проблемы и не прибегая к дополнительным модулям. Узнаешь много нового пока решаешь smile



--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.