|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/32383dfc3fe9.html, оценка из 5, голосов 10
|