![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| r |
|
|||
|
Unregistered |
Привет Всем, проблема вот в чём, я написал небольшой анонимайзер, это такой скрипт через который в инете можно лазить анонимно, плюс можно обрезать разную рекламу, графику и т. д. (правда ещё не доработал) . Так вот суть в том что при коннекте на rambler появляются символы в другой кодировке, а при том-же подключении на yandex русские. Вот код:
Спасибо. |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Подправил немного, но это я сделал в ручную и особо не тестировал, потому могут быть глюки:
Если что-то не поймёшь, спрашивай. Удачи. Это сообщение отредактировал(а) korob2001 - 18.4.2005, 12:48 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| r |
|
|||
|
Unregistered |
Спасибо, пашет. Буду искать где про это написано.
|
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| r |
|
|||
|
Unregistered |
Вот тут уже не понял, shift должен 'сдвигать' первый символ и возвратить его(вроде так). И вроде обрабатывать он должен $_. Так что-же ты обрабатываешь? P. s. Вопросы ещё есть. Спасибо. |
|||
|
||||
| korob2001 |
|
||||||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
На самом деле, всё начинается с этой строки:
Здесь я с помощью модуля LWP::Simple делаю запрос на заголовок, только что полученного URL, затем разбиваю полученный ответ на части:
Теперь мы имеем тип и кодировку данного URL. Далее делаем запрос на саму страницу:
Затем передаю в подпрограмму get_param() полученные тип и кодировку:
В этот момент выполнение переходит именно в эту подпрограмму, в её первых строках я извлекаю переданные параметры, т.е. тип документа и кодировку:
На самом деле shift выталкивает из массива @_ первый элемент, т.е. это и есть стёк. Но если не удлось определить кодировку и тип документа, то присваиваю им значения по умолчанию. Далее всё думаю понятно, вывожу заголовок в той кодировке, в которой и сам документ и тот же тип:
После вывожу форму, а затем закачивается подпрограмма get_param() и управление передаётся опять подпрограмме get_html(), в ту точку, где мы были когда переходили в подпрограмму get_param(), другими словами, мы попадаем на эту строку:
Т.е. выводим полученный документ, уже в его кодировке. Думаю теперь прояснилась ситуация. Удачи. -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||||||||||
|
|||||||||||||||||
| r |
|
||||
|
Unregistered |
Не-а, не прояснилась, как-то странно у тебя получает переменная $enc заголовок
почему она в скобках? Следующее, я знаю как работает фун-я split, но тут я не понял, переменная $encoding получается массив или как?
Спасибо. |
||||
|
|||||
| korob2001 |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 13 Всего: 61 |
Ну вот, отвёл сына к маме
Ладно, теперь о делах.
Не путай функцию модуля CGI.pm header, с функцией модуля LWP::Simple head. Так вот функция head возвращает заголовок полученный от узла, который ей передан в качестве параметра. Например rambler.ru возвращает такой заголовок: text/html; charset=koi8-rnginx/0.1.28 Это можно проверить следующим кодом:
Ладно из полученного заголовка мы видим, что сервер возвращает тип документа: text/html После идёт точка с запятой, после которой видим кодировку charset=....., вот она-то нам и нужна. Но функция head, в скалярном контексте вернёт объект на пакет HTTP::Response, можно было бы получить всю необходимую инфу и с помощью него, но так как нас интересует кодировака, гораздо проще вызвать head в списковом контексте, вот для чего нужны были круглые скобки, именно они и задают переменной $enc списковой контекст. После того, как заголовок получен, нам нужно выудить кодировку, разбиваем строку по символу ;, у нас получается следующие 2 строки заголовка: text/html - тип документа charset=koi8-r - кодировка но в кодировке теперь нам нужно отсечь charset, потому разбиваем строку с кодировкой по символу =, так как split возвращает список подстрок, которые были между символами - разделителями, а нас интересует только 1 подстрока ( отсчёт начинается с нуля ). Нулевой элемент будет содержать подстроку: charset, нам она не нужна и что бы не загонять её в память, я сразуже указал что меня интересует именно первый элемент. Если бы я не захватил в круглые скобки split:
то переменной $encode будет присвоено кол-во елементов которое возвращает split, т.е. 2 ( chaest, koi8-r ). Можно было написать и так:
Но нам ведь не нужно само слово charset, потому я и захватил split в скоби, что бы получить список и тут же извлечь только первый параметр ( ещё раз повторю начало с нулевого ). Потому пишем так:
Ну вот и всё, хотя это и не самый лучший способ. Это сообщение отредактировал(а) korob2001 - 1.5.2005, 19:00 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||||||||
|
|||||||||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |