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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодировка, Неправильная какая-то. 
:(
    Опции темы
r
Дата 17.4.2005, 21:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет Всем, проблема вот в чём, я написал небольшой анонимайзер, это такой скрипт через который в инете можно лазить анонимно, плюс можно обрезать разную рекламу, графику и т. д. (правда ещё не доработал) . Так вот суть в том что при коннекте на rambler появляются символы в другой кодировке, а при том-же подключении на yandex русские. Вот код:
Код

#!/usr/bin/perl -w
use strict;
use CGI;
use LWP::Simple; 
my $cgi = new CGI;

sub get_param{
print $cgi->start_html,
$cgi->start_form,
 $cgi->textfield( -name => 'url',
                -size => 70,
            ),
                
                 $cgi->submit( -name => 'adress',
                                     -value => 'go!' ),
                    $cgi->end_form,
                
}

sub get_html {
my $url=$cgi->param("url");
my $doc = get "$url";
get_param;
print "$doc";
}



print $cgi->header('text/html');
if ( defined $cgi->param('adress') ) {
get_html;
}else {
get_param;
};


Спасибо.
  Вверх
korob2001
Дата 18.4.2005, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Подправил немного, но это я сделал в ручную и особо не тестировал, потому могут быть глюки:
Код

#!/usr/bin/perl -w
use strict;
use CGI;
use LWP::Simple;
my $cgi = new CGI;

sub get_param{
my $type = shift || 'text/html';
my $enc  = shift || 'Windows-1251';
print $cgi->header( -charset => $enc,
                    -type    => $type);
print $cgi->start_html,
$cgi->start_form,
 $cgi->textfield( -name => 'url',
                -size => 70,
            ),

                 $cgi->submit( -name => 'adress',
                               -value => 'go!' ),
                    $cgi->end_form,

}

sub get_html {
my $url=$cgi->param("url");
my( $enc ) = head( $url );
my( $type, $encoding ) = split(';', $enc);
$encoding = ( split('=', $encoding) )[1];
my $doc = get( $url );
get_param( $type, $encoding );
print $doc;
}

if ( defined $cgi->param('adress') ) {
get_html;
}else {
get_param;
};

Если что-то не поймёшь, спрашивай.
Удачи.

Это сообщение отредактировал(а) korob2001 - 18.4.2005, 12:48


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
r
Дата 24.4.2005, 13:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, пашет. Буду искать где про это написано.
  Вверх
korob2001
Дата 24.4.2005, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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





--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
r
Дата 24.4.2005, 18:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(korob2001 @ 18.4.2005, 12:46)

my $type = shift || 'text/html';
my $enc  = shift || 'Windows-1251';
print $cgi->header( -charset => $enc,
                    -type    => $type);

Вот тут уже не понял, shift должен 'сдвигать' первый символ и возвратить его(вроде так). И вроде обрабатывать он должен $_. Так что-же ты обрабатываешь?

P. s. Вопросы ещё есть. Спасибо.
  Вверх
korob2001
Дата 24.4.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

Вот тут уже не понял, shift должен 'сдвигать' первый символ и возвратить его(вроде так). И вроде обрабатывать он должен $_. Так что-же ты обрабатываешь?

На самом деле, всё начинается с этой строки:
Код

my( $enc ) = head( $url );

Здесь я с помощью модуля LWP::Simple делаю запрос на заголовок, только что полученного URL, затем разбиваю полученный ответ на части:
Код

my( $type, $encoding ) = split(';', $enc);
$encoding = ( split('=', $encoding) )[1];

Теперь мы имеем тип и кодировку данного URL. Далее делаем запрос на саму страницу:
Код

my $doc = get( $url );

Затем передаю в подпрограмму get_param() полученные тип и кодировку:
Код

get_param( $type, $encoding );

В этот момент выполнение переходит именно в эту подпрограмму, в её первых строках я извлекаю переданные параметры, т.е. тип документа и кодировку:
Код

my $type = shift || 'text/html';
my $enc  = shift || 'Windows-1251';

На самом деле shift выталкивает из массива @_ первый элемент, т.е. это и есть стёк. Но если не удлось определить кодировку и тип документа, то присваиваю им значения по умолчанию. Далее всё думаю понятно, вывожу заголовок в той кодировке, в которой и сам документ и тот же тип:
Код

print $cgi->header( -charset => $enc,
                    -type    => $type);

После вывожу форму, а затем закачивается подпрограмма get_param() и управление передаётся опять подпрограмме get_html(), в ту точку, где мы были когда переходили в подпрограмму get_param(), другими словами, мы попадаем на эту строку:
Код

print $doc;

Т.е. выводим полученный документ, уже в его кодировке.
Думаю теперь прояснилась ситуация. smile

Удачи.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
r
Дата 30.4.2005, 22:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Не-а, не прояснилась, как-то странно у тебя получает переменная $enc заголовок
Код

my( $enc ) = head( $url );

почему она в скобках? Следующее, я знаю как работает фун-я split, но тут я не понял,
переменная $encoding получается массив или как?
Код

$encoding = ( split('=', $encoding) )[1];

Спасибо.
  Вверх
korob2001
Дата 1.5.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Ну вот, отвёл сына к маме smile
Ладно, теперь о делах.
Цитата

Не-а, не прояснилась, как-то странно у тебя получает переменная $enc заголовок

Не путай функцию модуля CGI.pm header, с функцией модуля LWP::Simple head. Так вот функция head возвращает заголовок полученный от узла, который ей передан в качестве параметра. Например rambler.ru возвращает такой заголовок:
text/html; charset=koi8-rnginx/0.1.28
Это можно проверить следующим кодом:
Код

#!/usr/bin/perl -w
use strict;
use LWP::Simple;
print("Rampler: " , head('http://www.rambler.ru') , "\n");

Ладно из полученного заголовка мы видим, что сервер возвращает тип документа:
text/html
После идёт точка с запятой, после которой видим кодировку charset=....., вот она-то нам и нужна. Но функция head, в скалярном контексте вернёт объект на пакет HTTP::Response, можно было бы получить всю необходимую инфу и с помощью него, но так как нас интересует кодировака, гораздо проще вызвать head в списковом контексте, вот для чего нужны были круглые скобки, именно они и задают переменной $enc списковой контекст.
После того, как заголовок получен, нам нужно выудить кодировку, разбиваем строку по символу ;, у нас получается следующие 2 строки заголовка:
text/html - тип документа
charset=koi8-r - кодировка
но в кодировке теперь нам нужно отсечь charset, потому разбиваем строку с кодировкой по символу =, так как split возвращает список подстрок, которые были между символами - разделителями, а нас интересует только 1 подстрока ( отсчёт начинается с нуля ). Нулевой элемент будет содержать подстроку: charset, нам она не нужна и что бы не загонять её в память, я сразуже указал что меня интересует именно первый элемент. Если бы я не захватил в круглые скобки split:
Код

$encode = split('=', $encode);

то переменной $encode будет присвоено кол-во елементов которое возвращает split, т.е. 2 ( chaest, koi8-r ). Можно было написать и так:
Код

( $charset, $encode ) = split('=', $encode);

Но нам ведь не нужно само слово charset, потому я и захватил split в скоби, что бы получить список и тут же извлечь только первый параметр ( ещё раз повторю начало с нулевого ). Потому пишем так:
Код

$encode = ( split('=', $encode) )[1];

Ну вот и всё, хотя это и не самый лучший способ.

Это сообщение отредактировал(а) korob2001 - 1.5.2005, 19:00


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


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

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


 




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


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

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