Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Andrew Ustinchik                     2:450/142.10   15 Dec 2002  11:05:59
 To : All
 Subject : правильное ескейпирование русского
 -------------------------------------------------------------------------------- 
 
 
     совсем запутался... 8-E
 
     есть директория (с фотками), вида
     ./bc/Могилёв/Андрей/1.jpg
     ./bc/Гомель/Жанна/Дома.jpg
     ./bc/Брест/Hаира/1%20009.jpg
     и т.д.
 
     есть скрипт, который лазит по всему этому и показвает эти фотки...
     получается:
       1) получаются вызовы типа /cgi-bin/bc.pl?struct=Могилёв
                                 /cgi-bin/bc.pl?struct=Могилёв?name=Андрей
                                
 /cgi-bin/bc.pl?struct=Могилёв?name=Андрей?picture=1.jpg
 
       2) а ссылки на картинки получаются в виде /bc/Гомель/Жанна/Дома.jpg
             ну, типа   <a HREF="/bc/Гомель/Жанна/Дома.jpg">
                        <img SRC="/bc/Гомель/Жанна/Дома.jpg">
 
 вопрос: как _правильно_ всё это передавать и прописывать, что надо ескейпить и
 где?
 эмпирическим путём получил, что при передаче через бровзер надо ескейпить в вид 
 %хх,
 а при ссылке на картинку внутри ХТМЛ - не нуна (тока пробелы)
 perldoc CGI курил,
 Главу AUTOESCAPING HTML курил
 escapeHTML так и не заработала :(( поэтому делал всё своими (кривыми?) руками.
 :)
 
 скрипт на всякий случай,
 всё это крутится на работе на ВинХР, АктивСтейтПерл 5.6.1, Апач 2.0.43 (а может 
 в нём чего покрутить?????)
 ткните носом куданить... с английским тоже дружу... не дайте помереть....
 в таком виде вродь работает, но не на всех бровзерах... вернее на Опере и ИЕ
 старше 5.0...
 >===  Здесь начался bc.pl ===
 
 #!perl -w
 use strict;
 use locale;
 
 use CGI::Carp qw(fatalsToBrowser);
 use CGI;
 use Ip;
 
 sub escape($) {
     my $s = shift;
     $s =~ s/(.)/sprintf("%%%x",ord($1))/ge;
     return $s;
 };
 
 sub escape_space($) {
     my $s = shift;
     $s =~ s/ /%20/g;
     return $s;
 };
 
 our $Directory = '../www/bc';
 our $p         = new CGI;
 
 print $p->redirect('/context.shtml')
   unless ( defined $Ip::ip{ $ENV{REMOTE_ADDR} } );
 
 print $p->header(
     -type    => 'text/html',
     -charset => 'windows-1251',
     -expires => 'now'
   ),
 
   $p->start_html(
 
     -title => "Фотоальбом Брестского чата: привет "
       . $Ip::ip{ $ENV{REMOTE_ADDR} },
     -style => { 'src' => '/bc.css' }
   ),
 
   $p->a(
 
     { -href => '/cgi-bin/bc.pl' },
     $p->h1(
         {
             -align => 'center',
             -style => 'color: darkblue; text-decoration: none'
         },
         'Фотоальбом Брестского чата'
     ),
     $p->hr( { -width => '50%' } )
   );
 
 if ( !$p->param ) {
     print "<center>";
     opendir( DIR, "$Directory" );
     map {
         print $p->a( { -href => "/cgi-bin/bc.pl?struct=" . escape($_) }, $_ ),
           $p->br;
       }
       grep { !/^\./ } sort readdir(DIR);
     closedir(DIR);
     print "</center>";
 }
 
 elsif ( defined( $p->param('picture') ) ) {
     print $p->a(
         { -href => "/cgi-bin/bc.pl?struct=" . escape( $p->param('struct') ) },
         $p->h2(
             {
                 -align => 'center',
                 -style => 'color: green; text-decoration: none'
             },
             $p->param('struct')
         )
     );
     print $p->hr( { -width => '75%' } );
     print $p->h3( { -align => 'center', -style => 'color: magenta' },
         $p->param('name') );
     print $p->hr( { -width => '50%' } );
     opendir( DIR,
         "$Directory/" . $p->param('struct') . "/" . $p->param('name') );
     print "<table WIDTH=90% BORDER=0 ALIGN=center>
              <tr>
                <td ALIGN=center WIDTH=15% VALIGN=top>";
     map {
         print $p->a(
             {
                 -href => "/cgi-bin/bc.pl?struct="
                   . escape( $p->param('struct') )
                   . "&name="
                   . escape( $p->param('name') )
                   . "&picture="
                   . escape($_)
             },
             $_
           ),
           $p->br;
       }
       grep { !/^\./ } sort readdir(DIR);
     closedir(DIR);
     my $filename = "/bc/"
       . $p->param('struct') . "/"
       . $p->param('name') . "/"
       . $p->param('picture');
 
     $filename = escape_space($filename);
 
     print "</td>
            <td WIDTH=75% ALIGN=center>
               <a HREF=\"$filename\" TARGET=_blank>
                  <img SRC=\"$filename\" BORDER=0 WIDTH=400>
               </a>
            </td>
          </tr>
        </table>";
 }
 
 elsif ( defined( $p->param('name') ) ) {
     print $p->a(
         { -href => "/cgi-bin/bc.pl?struct=" . escape( $p->param('struct') ) },
         $p->h2(
             {
                 -align => 'center',
                 -style => 'color: green; text-decoration: none'
             },
             $p->param('struct')
         )
     );
     print $p->hr( { -width => '75%' } );
     print $p->h3( { -align => 'center' }, $p->param('name') );
     print $p->hr( { -width => '50%' } );
     print "<table WIDTH=90% BORDER=0 ALIGN=center>
              <tr>
                <td ALIGN=center WIDTH=15% VALIGN=top>";
     opendir( DIR,
         "$Directory/" . $p->param('struct') . "/" . $p->param('name') );
     map {
         print $p->a(
             {
                 -href => "/cgi-bin/bc.pl?struct="
                   . escape( $p->param('struct') )
                   . "&name="
                   . escape( $p->param('name') )
                   . "&picture="
                   . escape($_)
             },
             $_
           ),
           $p->br;
       }
       grep { !/^\./ } sort readdir(DIR);
     closedir(DIR);
     print "</td>
            <td WIDTH=75% ALIGN=center> 
            </td>
          </tr>
        </table>";
 }
 
 elsif ( defined( $p->param('struct') ) ) {
     print $p->a(
         { -href => "/cgi-bin/bc.pl?struct=" . escape( $p->param('struct') ) },
         $p->h2(
             {
                 -align => 'center',
                 -style => 'color: green; text-decoration: none'
             },
             $p->param('struct')
         )
     );
     print $p->hr( { -width => '75%' } );
     print "<center>";
     opendir( DIR, "$Directory/" . $p->param('struct') );
     map {
         print $p->a(
             {
                 -href => "/cgi-bin/bc.pl?struct="
                   . escape( $p->param('struct') )
                   . "&name="
                   . escape($_)
             },
             $_
           ),
           $p->br;
       }
       grep { !/^\./ } sort readdir(DIR);
     closedir(DIR);
     print "</center>";
 }
 
 print $p->hr, $p->br,
 
   $p->a(
 
     { -href => '/context.shtml' },
     $p->p(
         {
             -align => 'center',
             -style => 'color: gray; font-size: 8pt; text-decoration: none'
         },
         'на главную страничку'
     )
   ),
 
   $p->end_html;
 >=== Здесь скончался bc.pl ===
 
 >===  Здесь начался Ip.pm ===
 
 package Ip;
 use 5.006;
 require Exporter;
 
 @ISA = qw(Exporter);
 @EXPORT = qw();
 
 our %ip = (
     '127.0.0.1'  => 'Я',
     '21.1.30.10' => 'Я',
     '21.1.42.38' => 'Жора'
 );
 
 >=== Здесь скончался Ip.pm ===
 
                                                 С уважением, Дедушка АУ.
                                                 +375-297-72-72-16
 
 ... транзитный семьянин GoldED+/LNX 1.1.4.7
 --- One man and his notebook with Linux [RegLinUser #256924]
  * Origin: Hет повести печальнее на свете, чем пиво на последние (2:450/142.10)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 правильное ескейпирование русского   Andrew Ustinchik   15 Dec 2002 11:05:59 
 Re: правильное ескейпирование русского   Artem Chuprina   16 Dec 2002 14:58:18 
 правильное ескейпирование русского   Denis Knyazev   17 Dec 2002 20:23:03 
 правильное ескейпирование русского   Denis Knyazev   18 Dec 2002 21:19:04 
Архивное /ru.cgi.perl/32383dfc3fe9.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional