gul@gmx.netї). Но, во-первых, для ее работы
требуется наличие Windows. Во-вторых, обнаружился маленький глюк.
Если в программе используется определение хэшей, то происходит не адекватное их преобразование
при перекодировке. Например:
my %ucb;
my %lst;
Превращались в
my 0cb;
my t;
Как мне это подпортило крови пока нашел почему не работает уже отлаженный cgi-скрипт! :)
Возможно есть и другие связки символа % с латинскими буквами подвергающиеся
подобным превращениям - я специально не искал.
2 В первом варианте статьи предлагалось использовать "/[Ww][Ii][Nn]/".
Но один товарищ, который к сожалению предпочел остаться анонимом, напомнил о существовании
ключа i в регулярных выражениях. Я буду очень рад если он мне напишет.
Примеры скриптов.
Перекодировка файлов
Из win1251 в koi8-r
#!/usr/bin/perl
use strict;
print "Convert file from win1251 to koi8r encodingn";
my $prg = "w2k.pl";
if ($#ARGV < 1) {
print " use: $prg Infile Outfilen";
exit(0);
};
unless (-e $ARGV[0]) {
print " $prg: file $ARGV[0] don't existsn";
exit;
}
my $in = my $fi = $ARGV[0];
if($fi =~ ///) {
$fi = substr($fi, rindex($fi, "/")+1);
}
my $out = $ARGV[1];
if(-d $out) {
$out =~ s/[/]+$//;
$out .= "/".$fi;
}
print " $prg: $in... ";
open(IN, "$in") || die;
open(OUT, ">$out") || die;
while() {
s/%/%%/g;
printf OUT win2koi($_);
};
close(OUT);
close(IN);
print "$outn";
# from packages Lingua::RU::Charset
sub win2koi
{
my @str = @_; # copy the arguments
map { tr/xB8xA8xFExE0xE1xF6xE4xE5xF4xE3xF5xE8-xEFxFFxF0-xF3xE6xE2xFCxFBxE7xF8xFDxF9
xF7xFAxDExC0xC1xD6xC4xC5xD4xC3xD5xC8-xCFxDFxD0-xD3xC6xC2xDCxDBxC7xD8xDDxD9xD7xDA/xA3xB3xC0-xFF/ } @str;
return @str;
}
Из koi8-r в win1251
#!/usr/bin/perl
use strict;
print "Convert file from koi8r to win1251 encodingn";
my $prg = "k2w.pl";
if ($#ARGV < 1) {
print " use: $prg Infile Outfilen";
exit(0);
};
unless (-e $ARGV[0]) {
print " $prg: file $ARGV[0] don't existsn";
exit;
}
my $in = my $fi = $ARGV[0];
if($fi =~ ///) {
$fi = substr($fi, rindex($fi, "/")+1);
}
my $out = $ARGV[1];
if(-d $out) {
$out =~ s/[/]+$//;
$out .= "/".$fi;
}
print " $prg: $in... ";
open(IN, "$in") || die;
open(OUT, ">$out") || die;
while() {
s/%/%%/g;
printf OUT koi2win($_);
};
close(OUT);
close(IN);
print "$outn";
# from packages Lingua::RU::Charset
sub koi2win
{
my @str = @_; # copy the arguments
map { tr/xA3xB3xC0-xFF/xB8xA8xFExE0xE1xF6xE4xE5xF4xE3xF5xE8-xEFxFFxF0-xF3xE6xE2xFCxFBxE7xF8xFD
xF9xF7xFAxDExC0xC1xD6xC4xC5xD4xC3xD5xC8-xCFxDFxD0-xD3xC6xC2xDCxDBxC7xD8xDDxD9xD7xDA/ } @str;
return @str;
}