Автор Тема: модуль Encode::InCharset, как detect encoding, определение кодировки строки  (Прочитано 4719 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Если Вы сталкивались с этой проблемой, подскажите как вы ее решили. я пытаюсь ее решить с помощью модуля
Encode::InCharset

И, честно говоря, пока он ругается \\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"

 
вот такой момент
« Последнее редактирование: 05 Декабря 2006, 16:11:45 от ravshaniy »
убили кенни, сволочи

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
я разобрался как работает модуль. суть его выполнения в создании своих собственных свойств символов.
то есть есть например такой файл: 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"};

тоже никонда не встречал и она мне не понятна

вот. Может кто сталкивался или посоветует что нить?
убили кенни, сволочи

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
импорт sub InCP1251 из cp1251.pm в свой неймспейс.
perldoc -f caller

какая задача стоит перед вами?
The documentations is your friend

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
задача простая до боли, определить кодировку строки
убили кенни, сволочи

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Я в свое время остался доволен работой Encode::Detect::Detector. Вроде автор продолжает его поддерживать и сейчас.
The documentations is your friend

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
о круто, спасибо попробую сейчас установить

по модулю Encode::InCharset похоже нужно еще разбираться с поддержкой Unicode по крайней мере советуют perlunicode почитать
убили кенни, сволочи

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28