| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > Кодировка |
| Автор: r 17.4.2005, 21:38 | ||
Привет Всем, проблема вот в чём, я написал небольшой анонимайзер, это такой скрипт через который в инете можно лазить анонимно, плюс можно обрезать разную рекламу, графику и т. д. (правда ещё не доработал) . Так вот суть в том что при коннекте на rambler появляются символы в другой кодировке, а при том-же подключении на yandex русские. Вот код:
Спасибо. |
| Автор: korob2001 18.4.2005, 12:46 | ||
Подправил немного, но это я сделал в ручную и особо не тестировал, потому могут быть глюки:
Если что-то не поймёшь, спрашивай. Удачи. |
| Автор: r 24.4.2005, 13:21 |
| Спасибо, пашет. Буду искать где про это написано. |
| Автор: korob2001 24.4.2005, 14:10 |
| Ищи здесь: http://vingrad.ru/download/perl/LWP-spec.pdf |
| Автор: r 24.4.2005, 18:56 | ||
Вот тут уже не понял, shift должен 'сдвигать' первый символ и возвратить его(вроде так). И вроде обрабатывать он должен $_. Так что-же ты обрабатываешь? P. s. Вопросы ещё есть. Спасибо. |
| Автор: korob2001 24.4.2005, 19:38 | ||||||||||||||||
На самом деле, всё начинается с этой строки:
Здесь я с помощью модуля LWP::Simple делаю запрос на заголовок, только что полученного URL, затем разбиваю полученный ответ на части:
Теперь мы имеем тип и кодировку данного URL. Далее делаем запрос на саму страницу:
Затем передаю в подпрограмму get_param() полученные тип и кодировку:
В этот момент выполнение переходит именно в эту подпрограмму, в её первых строках я извлекаю переданные параметры, т.е. тип документа и кодировку:
На самом деле shift выталкивает из массива @_ первый элемент, т.е. это и есть стёк. Но если не удлось определить кодировку и тип документа, то присваиваю им значения по умолчанию. Далее всё думаю понятно, вывожу заголовок в той кодировке, в которой и сам документ и тот же тип:
После вывожу форму, а затем закачивается подпрограмма get_param() и управление передаётся опять подпрограмме get_html(), в ту точку, где мы были когда переходили в подпрограмму get_param(), другими словами, мы попадаем на эту строку:
Т.е. выводим полученный документ, уже в его кодировке. Думаю теперь прояснилась ситуация. Удачи. |
| Автор: r 30.4.2005, 22:07 | ||||
Не-а, не прояснилась, как-то странно у тебя получает переменная $enc заголовок
почему она в скобках? Следующее, я знаю как работает фун-я split, но тут я не понял, переменная $encoding получается массив или как?
Спасибо. |
| Автор: korob2001 1.5.2005, 18:58 | ||||||||||
| Ну вот, отвёл сына к маме Ладно, теперь о делах.
Не путай функцию модуля 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 в скоби, что бы получить список и тут же извлечь только первый параметр ( ещё раз повторю начало с нулевого ). Потому пишем так:
Ну вот и всё, хотя это и не самый лучший способ. |