4 use Encode qw(:fallbacks find_encoding);
5 our $VERSION = do { my @r = (q$Revision: 1.1 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
8 $Encode::Encoding{$Canon} = bless { Name => $Canon } => __PACKAGE__;
11 map { $_ => find_encoding($_) } qw(ascii utf8);
17 %CANDIDATES = %DEF_CANDIDATES;
19 my $e = find_encoding($c) or die "Unknown encoding: $c";
20 $CANDIDATES{$e->name} = $e;
21 $DEBUG and warn "Added: ", $e->name;
25 sub name { shift->{'Name'} }
26 sub new_sequence { $_[0] }
31 my ($obj, $octet, $chk) = @_;
32 my $utf8 = $obj->guess($octet)->decode($octet, $chk);
33 $_[1] = $octet if $chk;
38 croak "Tsk, tsk, tsk. You can't be too lazy here here!";
42 my ($obj, $octet) = @_;
44 Encode::is_utf8($octet) and return find_encoding('utf8');
45 my %try = %CANDIDATES;
47 for my $line (split /\r|\n|\r\n/, $octet){
51 delete @try{qw/utf8 ascii/};
53 ref($try{$k}) eq 'Encode::XS' and delete $try{$k};
57 # warn join(",", keys %try);
58 for my $k (keys %try){
60 $try{$k}->decode($scratch, FB_QUIET);
62 $DEBUG and warn sprintf("%4d:%-24s ok\n", $nline, $k);
66 warn sprintf("%4d:%-24s not ok; %d bytes left\n",
67 $nline, $k, bytes::length($scratch));
72 %ok or croak "No appropriate encodings found!";
73 if (scalar(keys(%ok)) == 1){
74 my ($retval) = values(%ok);
80 croak "Encodings too ambiguous: ",
81 join(" or ", keys %try);
92 Encode::Guess -- guesscoding!