|
|
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
|