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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не выводится русский шрифт 
:(
    Опции темы
Rezzonans
Дата 28.6.2005, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мужики, я только начал пёрл изучать. У меня такая проблема:

Код

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print"<form name = 'act' method = 'POST' action = '/cgi-bin/test2.pl'>";
printf"<textarea name = 'vf'></textarea>";
printf"<input type = \"submit\" name = \"olg\">";

read(STDIN,$fd,$ENV{'CONTENT_LENGTH'});
$fd =~ s/%(..)/pack("C",hex($l))/eg;
$fd =~ tr/+/ /;

@pairs = split(/&/,$fd);

foreach $pair (@pairs){
     ($name,$value) = split(/=/,$pair);
      $form_fd{$name} = $value;
}

open(OUT_FP,">>/1.txt") or die;
print OUT_FP $form_fd{vf}, "\n";
close(OUT_FP);


Ввожу текст английскими буквами, он отпечатывается в файле 1.txt, ввожу русскими - сплошные пробелы. И ещё, как обнуляется переменная CONTENT_LENGTH, иначе, при нажатии кнопки обновить, в файл записывается предыдущее сообщение. Объясните всё это дело, если не затруднит. Заранее спасибо.

Это сообщение отредактировал(а) korob2001 - 28.6.2005, 18:39
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
korob2001
Дата 28.6.2005, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Попробуй декодировать данные полученные из формы таким способом:
Код

sub param {
    my %param;
    my $value;
    my @values = split(/&/, $ENV{ QUERY_STRING });
    if ( $ENV{ REQUEST_METHOD } eq 'POST' ) {
         my $q = "";
         read( STDIN, $q, $ENV{ CONTENT_LENGTH } ) == $ENV{ CONTENT_LENGTH } or die return undef;
         push( @values, split(/&/, $q);
    }

    for $value ( @values ) {
        my( $n, $v ) = split(/=/, $value);
        $n =~ y/+/ /;
        $n =~ s/%([\da-f][\da-f])/chr( hex($1) )/ige;
        $v = "" unless defined $v;
        $v =~ y/+/ /;
        $v =~ s/%([\da-f][\da-f])/chr( hex($1) )/ige;
        $param{ $n } = $v;
    }
  return %param();
}

Удачи.

М
 
И в следующий раз пользуйся пожалуйста кнопкой код, для сохранения формата и пдсветки кода.
Спасибо.


Это сообщение отредактировал(а) korob2001 - 28.6.2005, 18:41


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


Шустрый
*


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

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



Спасибо большое, я нашёл в своём коде ошибку, нужно было функции hex передать параметр $1, а я передавал $l. А в новом коде я не понял смысл следующей строки:


Код
read( STDIN, $q, $ENV{ CONTENT_LENGTH } ) == $ENV{CONTENT_LENGTH} or die return undef;



здесь, как я понимаю, в переменную $q считывается сообщение со стандартного входа STDIN при помощи переменной CONTENT_LENGTH? Или может я ошибаюсь? А сравнение дальше зачем?

Это сообщение отредактировал(а) Rezzonans - 28.6.2005, 21:51
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
sharq
Дата 28.6.2005, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



А почему не использовать модуь CGI, он как раз для этих целей создан, и таких проблем не будет, тем более, для начинающих.

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Rezzonans
Дата 29.6.2005, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(sharq @ 28.6.2005, 22:06)
А почему не использовать модуь CGI, он как раз для этих целей создан, и таких проблем не будет, тем более, для начинающих.

smile

С модулем CGI? В принципе я в конце-концов пришёл к выводу, что всётаки так будет проще. Вот:

Код


#!perl

use CGI;
       $db_url = "/dat.dat";

$query = CGI->new;
print

     $query->header,
     $query->start_html(),
     $query -> hr();

$user = $query->param('name');
$email = $query->param('email');
$message = $query->param('message');



$def = "$user \: \: $email\n$message";


#
  if($user && $email && $message){
#


open(FP_OUT,">>$db_url");
print FP_OUT $def, "\n\n";
close(FP_OUT);

    open(IN_FP,"<$db_url");
    @datas = <IN_FP>;
    close(IN_FP);
    for($i=0;$i<=$#datas;$i++){
    print"\n";
    if($datas[$i] == "\n"){
    print "<br>";
    }
    print "$datas[$i]\n";
    }
 


print

    $query->start_form,
    $query->textfield( -name=>'name',
                       -size=>20),
    $query->p,
    $query->textfield( -name=>'email',
                       -size=>20),
    $query->p,
    $query->textarea( -name=>"message",
                      -rows=>14,
                      -columns=>60, -default => ""),
    $query->p,
    $query -> submit(-name=>"Отправить"),
    $query -> end_form,
    $query -> end_html;

}
else{
open(IN_FP,"<$db_url");
    @datas = <IN_FP>;
    close(IN_FP);
    for($i=0;$i<=$#datas;$i++){
    print"\n";
    if($datas[$i] == "\n"){
    print "<br>";
    }
    print "$datas[$i]\n";
    }

print

    $query->start_form,
    $query->textfield( -name=>'name',
                       -size=>20),
    $query->p,
    $query->textfield( -name=>'email',
                       -size=>20),
    $query->p,
    $query->textarea( -name=>"message",
                      -rows=>14,
                      -columns=>60, -default => ""),
    $query->p,
    $query -> submit(-name=>"Захуячить"),
    $query -> end_form,
    $query -> end_html;


}




громоздко, но в принципе работает. Как вы наверное догадались - это некое подобие гостевой книги. Вопрос в том, как очистить поля после занесения записи в файл dat.dat. Иначе, при нажатии на кнопку обновить это сообщение записывается в файл ещё раз
--------------------
Первый детектор лжи был собран из ребра мужчины. Впрочем, до сих пор, никаких изменений не притерпел
PM MAIL   Вверх
korob2001
Дата 29.6.2005, 03:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Выводи страницу с успешным занесением записи в базу и делай redirect. Если же нуюно просто очистить поля от введённой ранее информации, то в самом поле укажи параметр override => 1:
Например:
Код

$query->textfield( -name => 'name',
                   -size => 30,
                   -override => 1 );            

Удачи.


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


Шустрый
*


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

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



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


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

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


 




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


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

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