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


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

Код

#!/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:38
Попробуй декодировать данные полученные из формы таким способом:
Код

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();
}

Удачи.

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

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


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



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

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

smile

Автор: Rezzonans 29.6.2005, 02:41
Цитата(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. Иначе, при нажатии на кнопку обновить это сообщение записывается в файл ещё раз

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

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

Удачи.

Автор: Rezzonans 29.6.2005, 16:10
Угу, пасиб большое!

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