[Moscow.pm] Подскажите пожалуйста, как определить кодировку файла? Надо уметь различать UTF-8, cp1251. Encode::Guess не детектит cp1251.

Dmitry Arsentiev dmarsentev на gmail.com
Пт Дек 17 09:36:32 PST 2010


Евгений, спасибо большое за отклик, Encode::Guess у меня заработал.

Причины, по которым Encode::Guess у меня не работал, были такими:

1) Я забыл поставить круглые скобки при вызове метода name()

Мне надо было писать не так
print "enc = ".$enc->name."\n";
а так:
print "enc = ".$enc->name()."\n";

2) При вызове guess_encoding надо было загружать только cp1251

Мне надо было писать не так
my $enc = guess_encoding( $data, qw/euc-jp shiftjis 7bit-jis UTF-8
utf-8 ascii cp1251/ );
а так
my $enc = guess_encoding( $data, qw/cp1251/ );

Не надо было указывать utf8, потому что модуль Encode::Guess
поддерживает распознавание utf8 сразу, "из коробки", без явного указания.


Я невнимательно прочёл документацию.
"By default, it checks only ascii, utf8 and UTF-16/32 with BOM.
use Encode::Guess; # ascii/utf8/BOMed UTF"
http://search.cpan.org/~dankogai/Encode-2.40/lib/Encode/Guess.pm

Евгений, спасибо за помощь,
вот мой работающий код, он распознаёт cp1251 и utf8.

#!/usr/bin/perl
use strict;
use warnings;
use Encode;
use Encode::Guess;

my $filename = "RDG_2010_0000_0001_0001.xml";
open my $fh, "<", $filename or die "can not open file $filename for reading \n";
my $data = do{ local $/; <$fh> };
close $fh;

my $enc = guess_encoding( $data, qw/cp1251/ );
print "enc = ".$enc->name()."\n";





17 декабря 2010 г. 20:03 пользователь Evgeniy Kosov <evgeniy на kosov.su> написал:
> On 17.12.2010 19:17, Dmitry Arsentiev wrote:
>>
>> Следующий кусок кода:
>> my $enc = guess_encoding( $data, qw/euc-jp shiftjis 7bit-jis UTF-8
>> utf-8 ascii cp1251/ );
>> print "enc = ".$enc->name."\n";
>> создаёт такое сообщение:
>> Can't locate object method "name" via package "utf-8-strict or utf8"
>> (perhaps you forgot to load "utf-8-strict or utf8"?) at ./try2guess.pl
>> line 41.
>
> На самом деле тут "utf-8-strict or utf8" -- сообщение об ошибке. В случае,
> когда кодировка определяется однозначно, возвращается объект Encode::XS, у
> которого можно в т.ч. "спросить" name(). Мягко говоря, своеобразный
> интерфейс...
>
> Я бы, наверное, продолжил искать альтернативы, или остановился на том, что
> посоветовал Lars.
>
> --
> BR,
> Evgeniy Kosov
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>


Подробная информация о списке рассылки Moscow-pm