Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > кодировка генерируемого Perl'om HTML-файла


Автор: deymos34 23.9.2005, 00:05
Здравствуйте!
Есть англоязычный скрипт аукциона на Перле. Перевел я его на русский, и все бы ничего, но возникли проблемы с кодировкой - как в русских описаниях лотов, так и в рассылаемых им письмах. Пришлось совершенствовать шапку генерируемого ХТМЛ-файла - добавить строку <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">. Не помогло (проверил, строка действительно добавляется в код, все ОК)! Проверял и в Эксплорере, и в Файерфоксе (автоопределение включено). Если же насильно переключить браузер на windows-1251, все отображается корректно.

Что посоветуете?

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

ЗЗЫ
Есть у меня скрипт другого аукциона, тоже на Перл, тоже самолично руссифицированный - так там проблем никаких нет, русский текст отображается корректно. При том, что в генерируемом им ХТМЛ-файле charset как не было, так и нет...

Заранее спасибо!

Автор: korob2001 23.9.2005, 00:36
Кодировку меняй в заголовках, а не на прямую вставляя тег <META>. Скорее всего они выводятся с помощью модуля CGI, т.е. ищи в скриптах заголовки header() и укажи нужную тебе кодировку header( -charset => "Windows-1251" ).
Если не поможет, тогда выкладывай код.

Автор: deymos34 23.9.2005, 17:25
К сожалению, не помогло.
заголовки header импортируются из header.txt
вставил в него соответствующий код - он появился в генерируемых HTML-страницах (правда, вне тега <HEAD>), но это не помогло.

Сам ПЕРЛ-код можно увидеть здесь:
http://reninfa.ru/auct.pl

Рабочий скрипт находится здесь:

http://reninfa.ru/cgi-bin/auct.pl

(соответственно можно увидеть генерируемый ПЕРЛ-скриптом ХТМЛ-код).

Автор: Usya 24.9.2005, 05:10
Я с этим не сталкивался, но в качестве пищи для размышления... Может прокатит smile

Цитата
Можно ли указать кодировку на все файлы, в которой по умолчанию получает документы браузер?

На заре интернета и зарождения браузеров, часто была ситуация, что браузер не мог автоматически определить, в какой из русских кодировок написан документ и в браузер выдавалась какая-то каша. Для избежания этого указываем, что все отдаваемые страницы будут иметь кодировку windows-1251:

AddDefaultCharset windows-1251

http://www.wmaster.ru/htaccess/index.htm

Автор: deymos34 25.9.2005, 00:46
К сожалению, и это не помогло...
Более того, я даже в httpd.conf добавил строку AddDefaultCharset WINDOWS-1251

Эффект нулевой...

Автор: sharq 25.9.2005, 02:19
deymos34

Просто замени все строки
Content-type: text/html
на
Content-Type: text/html; charset=windows-1251.

И все! smile

smile

Автор: deymos34 25.9.2005, 20:47
Увы, и это не помогло... smile

Автор: Usya 25.9.2005, 21:28
1) А ты не пробовал спрашивать у админа?
2) Есть одно предложение - не фонтан, но если других советов не будет, то может подойти на первое время.
Посмотри в html-коде, как у тебя записаны слова Авто, Бизнес и Видео, аудио.
Сделай также, через хэш - автоматом перекодируй все буквы русского языка smile
Правда это немного через задницу smile

Автор: sharq 25.9.2005, 22:20
Все просто: найди функцию print_header
Код

sub print_header {
   print $q->header;
   ...
}

Замени header на header(-charset => 'windows-1251')

smile

Автор: deymos34 26.9.2005, 00:38
Урааа!!!
Запахало - с помощью последнего совета. Всем спасибо.

А я, конечно, дурак - это еще в первом совете предлагалось, но реализовал я тогда криво smile

Автор: deymos34 27.9.2005, 00:48
Рано радовался...
Возникла еще одна проблема - скрипт не переваривает в вводимых пользователем данных кавычки (срезает всю инфу после них).
Дописал скрипт, чтобы он не принимал данные (выводя соответствующее сообщение), пока юзер не удалит все кавычки. А как сделать так, чтобы скрипт сам удалял кавычки?

Автор: Usya 27.9.2005, 20:35
Один из вариантов - через JavaScript, если с этим более менее знаком. При этом можно контролировать введенную инфу как при потере фокуса в нужном поле, так и при нажатии Submit.

Автор: sharq 27.9.2005, 23:24
deymos34 используя регулярные выражения:
Код

my $text = s/"|'//g; # удаляет все двойные или одинарные кавычки в переменной $text



Usya это не надежно. smile

smile

Автор: Usya 28.9.2005, 06:06
Цитата
Usya это не надежно.


sharq, когда это не срабатывает?

Кроме того, в любом случае от того что по мере заполнения формы (либо при отправке) юзеру будут выводиться сообщения о том, что в таких-то полях инфа будет немного модифицирована (либо некорректно введена) - не помешает.

Автор: sharq 28.9.2005, 10:02
Usya все очень просто: клиент отключает javascript или меняет его и данные в "кривом" виде отправляются на сервер, поэтому чтобу не произошло казусов при записи данных, лучше их проверять на сервере и записовать исправленными или отсылать ответ об ошибке.

smile

Автор: Usya 28.9.2005, 16:42
sharq, это не аргумент. Т.к. клиент при желании может вообще какую-нибудь лабуду послать и без кавычек. smile
Единственное, правда, я не знаю (не лазил) можно ли в настройках браузера где-нибудь отключить подобные javascript-ы, так чтобы при загрузке страницы они игнорировались. (Может где-нибудь в настройках безопасности...) Тогда согласен, так как это, в принципе, может сделать и клиент с вытекающими последствиями...

Автор: sharq 28.9.2005, 20:37
Цитата(Usya @ 28.9.2005, 17:42)
Т.к. клиент при желании может вообще какую-нибудь лабуду послать и без кавычек.

вот поэтому нужно проверять все на сервере, используя perl!

smile

Автор: korob2001 28.9.2005, 23:33
Цитата

(Может где-нибудь в настройках безопасности...) Тогда согласен, так как это, в принципе, может сделать и клиент с вытекающими последствиями...

Может и именно в настройках безопасности.
Потому не стоит доверяться языкам работающим на клиенте, хотя лучше всё же делать проверку на клиенте для удобства, для того, что бы не грузить сервер лишними запросами из-за того, что пользователь не ввёл кавычку и т.п., но на сервере должна быть проверка в любом случае.

Автор: Usya 29.9.2005, 06:05
Цитата
вот поэтому нужно проверять все на сервере, используя perl!


sharq, а как ты проверишь отосланы нормальные данные или абра-катабра? smile
В 99% это можно сделать только визуально...

korob2001
Хотел я написать на счет дублирования и загрузки сервака лишними запросами, но в дублировании мне очень не нравится одна вещь - если со временем что-то придется менять (через месяц или более), не всегда сразу вспомнишь где и что продублировал. А потом ищешь глюки smile
Если таковых исправлений не предвидется (проект будет сдан или...), то согласен - так и надо делать! smile

Автор: korob2001 29.9.2005, 08:14
Я такие вещи обхожу очень просто:
Код JavaScript пишу прямо в программе Perl, затем подгружаю конфигурационные переменные, допустим с регулярными выражениями, которые находятся в отдельном файле в виде модуля. Т.е. если мне нужно будет изменить кол-во допустимых символов в поле или вообще само регулярное выражение, то достаточно изменить только файл конфигурации и регулярное выражение изменится как в Perl программе, так и в сценарии JavaScript.
Вобщем почему бы не сгенерировать и HTML и JavaScript с помощью Perl?

Автор: sharq 29.9.2005, 10:55
Цитата(Usya @ 29.9.2005, 07:05)

sharq, а как ты проверишь отосланы нормальные данные или абра-катабра? smile
В 99% это можно сделать только визуально...

Необходимо максимально сделать защиту "от дурака".
Если поле введите число или дату, то проверяешь, только на числа и определенный формат.
Лексический разбор никто тебя не заставляет делать. smile

Автор: Usya 30.9.2005, 06:14
korob2001

Цитата
Вобщем почему бы не сгенерировать и HTML и JavaScript с помощью Perl?


Если не требуется выполнять проверку, то это оптимальный вариант. Сам так делаю smile Но, то что можно сделать, например, в Perle c помощью регулярных выражений в JavaScript придется делать немного по другому. Так что проверку условия, в общем случае, на Perle и JavaScripte придется делать немного по разному. И исправлять при необходимости придется в двух местах.

sharq

Цитата
Необходимо максимально сделать защиту "от дурака"


На это я и оставил 1% для тех форм где только числовые данные. В 99% остальных - смесь с текстовыми полями и проверить можно только визуально!!!

Автор: sharq 30.9.2005, 20:24
Цитата(Usya @ 30.9.2005, 07:14)
Обычно только числовые данные мало где используются smile

Не говори гоп, пока не перепрыгнешь народная мудрость!

smile

Автор: arto 10.10.2005, 12:49
# perl -Mstrict -Wc =(GET http://reninfa.ru/auct.pl) |& wc -l
24
#

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)