Forum Webscript.Ru
Программирование => Perl => Тема начата: ravshaniy от 04 Декабря 2006, 10:57:29
-
Если Вы сталкивались с этой проблемой, подскажите как вы ее решили. я пытаюсь ее решить с помощью модуля
Encode::InCharset (http://search.cpan.org/~dankogai/Encode-InCharset-0.03/InCharset.pm)
И, честно говоря, пока он ругается \\p{In}
Вот мой код
use strict;
use utf8;
use Encode::inCharset qw(InCP1251 InCP866 InKOI8_R);
my $item = \'хочу узнать кодировку\';
my @chkCharsets = qw(InCP1251 InCP866 InKOI8_R);
my $itemEnc = get_items_encoding($item, @chkCharsets);
sub get_items_encoding{
my ($item, @chkCharsets) = @_;
my $rs = 0;
for my $itemEnc(@chkCharsets) {
unless ($item =~ m/(\\p{$itemEnc})+/o){
($rs=$itemEnc)=~ s/^In(.*)$/$1/;
last;
}
print "$item - no match: $itemEnc\\n";
}
return $rs;
}
Ошибка:
Can\'t find Unicode property definition "InCP1251"
вот такой момент
-
я разобрался как работает модуль. суть его выполнения в создании своих собственных свойств символов.
то есть есть например такой файл: cp1251.pm
# This is auto-generated. Do not edit by hand!
package Encode::InCharset::cp1251;
our $VERSION = do {my @r = (q$Revision: 0.1 $ =~ /\\d+/g); sprintf "%d."."%02d"x$#r, @r};
sub InCP1251{
return <<\'END\';
0 7F
A0
A4
A6 A7
A9
AB AE
B0 B1
B5 B7
BB
401 40C
40E 44F
451 45C
45E 45F
490 491
2013 2014
2018 201A
201C 201E
2020 2022
2026
2030
2039 203A
20AC
2116
2122
END
}
1;
__END__
и загружается он через импорт
package Encode::InCharset;
use 5.007003;
use strict;
use warnings;
our $VERSION = do { my @r = (q$Revision: 0.3 $ =~ /\\d+/g); sprintf "%d."."%02d" x $#r, @r };
our $DEBUG = 1;
use Encode::InCharset::Config;
use Carp;
sub import{
my $class = shift;
my $callpkg = caller;
my @sub = @_ ? @_ : sort keys %Encode::InCharset::Config::InPM;
for my $sub (@sub){
no strict \'refs\';
my $mod = $Encode::InCharset::Config::InPM{$sub} or
croak "Unknown property: $sub";
my $modfile = $mod; $modfile =~ s,::,/,go;
eval { require "$modfile.pm" };
$@ and croak $@;
*{"$callpkg\\::$sub"} = \\&{"$mod\\::$sub"};
}
}
1;
__END__
что то мне подсказывает что под winXP - тестовая ось
eval { require "$modfile.pm" };
# вот эта строчка может и не выполнится
хотя большой вопрос по
вот этой конструкии:
*{"$callpkg\\::$sub"} = \\&{"$mod\\::$sub"};
тоже никонда не встречал и она мне не понятна
вот. Может кто сталкивался или посоветует что нить?
-
импорт sub InCP1251 из cp1251.pm в свой неймспейс.
perldoc -f caller
какая задача стоит перед вами?
-
задача простая до боли, определить кодировку строки
-
Я в свое время остался доволен работой Encode::Detect::Detector. Вроде автор продолжает его поддерживать и сейчас.
-
о круто, спасибо попробую сейчас установить
по модулю Encode::InCharset (http://search.cpan.org/~dankogai/Encode-InCharset-0.03/InCharset.pm) похоже нужно еще разбираться с поддержкой Unicode по крайней мере советуют perlunicode почитать