А что ещё ждать от автоматического определения кодировок? Это же эвристика. К нему лучше не прибегать, если точно известна кодировка заранее.
22 сентября 2014 г., 23:58 пользователь Nikolay Mishin <[email protected]> написал: > Илья, привет , удалил Text::Iconv > -my $converter = Text::Iconv->new( "cp1251", "utf-8"); > -$lang = $converter->convert($lang); > +Encode::from_to($lang, 'windows-1251', 'utf-8'); > https://github.com/mishin/presentation/commit/2d1ba8adcfc451d45454490b5bf442f95bd41e0a > и все заработало, > правда получается, что кодировка , которую Encode::Detect::Detector > определяет как ISO-8859-7 является одновременно и кодировкой windows-1251, > странно, что больше этого нигде не написано, в общем парадоксальное решение, > чисто перебором > > 22.09.2014, 12:51, "Илья Винокуров" <[email protected]>: >> Здравствуйте, Николай. >> >> Внутри Perl строки хранятся в кодировке, совместимой с UTF-8. Эта кодировка >> называется utf8. >> Когда строки вводятся в Perl, их нужно декодировать из различных кодировок >> в utf8. >> В том числе нужно декодировать UTF-8 в utf8. >> Если строку нужно вывести из Perl, то эту строку нужно кодировать в >> различные кодировки. >> В том числе нужно кодировать utf8 в UTF-8 >> >> Этим занимаются функции Encode::encode('UTF-8', $string) и >> Encode::decode('UTF-8', $string). >> >> Text::Iconv - не используйте это, если точно не знаете почему вам нужен >> именно этот модуль. >> >> Концепцию работы с кодировками в Perl я рассказал, >> а вот свой скрипт поправить потрудитесь сами пожалуйста... >> >> PS: Чтобы не возиться в явном виде с перекодированием строк, в перл >> используют >> >> binmode STDIN, ":encoding(console_in)" if -t STDIN; binmode STDOUT, >> ":encoding(console_out)" if -t STDOUT; binmode STDERR, >> ":encoding(console_out)" if -t STDERR; >> После этого в STDIN/STDOUT можно читать/писать строки в кодировке utf8 без >> перекодирования... >> >> С почтением, >> Илья Винокуров. >> >> Mon, 22 Sep 2014 01:28:15 +0400 от Nikolay Mishin <[email protected]>: >>> Привет, MoscowPM, >>> тут родился вопрос под win7 (юникс могут быть теже странности, не проверял) >>> >>> #!/usr/bin/env perl >>> use utf8; >>> use Modern::Perl; >>> use Encode::Locale; >>> use Encode qw( decode encode from_to); >>> use Text::Iconv; >>> use Encode::Detect::Detector; >>> use Data::Dumper qw( Dumper ); >>> >>> if (-t) >>> { >>> binmode(STDIN, ":encoding(console_in)"); >>> binmode(STDOUT, ":encoding(console_out)"); >>> binmode(STDERR, ":encoding(console_out)"); >>> } >>> >>> my $lang = shift or die "Usage: $0 What_is_your_language?\n"; >>> my_dump('lang_01',$lang); >>> my $converter = Text::Iconv->new( "cp1251", "utf-8"); >>> $lang = $converter->convert($lang); >>> my_dump('lang_02',$lang); >>> $lang = Encode::decode("utf8",$lang); >>> my_dump('lang_03',$lang); >>> my_dump('lang_04_перл',qq{перл}); >>> >>> $lang =~ /(perl|перл) (?{print "use Perl or die!!\nИспользуй Перл или >>> умри!!";}) /ix;#русский не мачится, почему? >>> >>> sub my_dump >>> { >>> my ($name,$var)=@_; >>> local $Data::Dumper::Useqq = 1; >>> local $Data::Dumper::Indent = 0; >>> local $Data::Dumper::Terse = 1; >>> print(Encode::Detect::Detector::detect(qq{$lang})." ".qq{\$$name }." >>> dump=".Dumper($var)."\n"); >>> } >>> >>> этот же код на гитхабе >>> https://github.com/mishin/presentation/blob/master/100_regex_4_moscow_pm.pl >>> >>> моя задача была, чтобы скрипт >>> perl 100_regex_4_moscow_pm.pl перл >>> читая из консоли слово "перл" находил его в регексе внутри скрипта >>> >>> вопросы: >>> 1) почему, если в консоле >>> perl -MEncode::Detect::Detector -E "say >>> Encode::Detect::Detector::detect(qq{перл})" >>> у меня кодировка ISO-8859-7 >>> my $converter = Text::Iconv->new( "cp1251", "utf-8"); >>> Text::Iconv ее проглатывает как cp1251 (причем ISO там не проходит) ? >>> >>> 2)что происходит со строкой здесь >>> UTF-8 $lang_02 dump="\320\277\320\265\321\200\320\273" >>> $lang = Encode::decode("utf8",$lang); >>> UTF-8 $lang_03 dump="\x{43f}\x{435}\x{440}\x{43b}" >>> --что такое делает decode? >>> я так понимаю - он починивает utf8, но что конкретно >>> >>> спасибо, хорошей недели!! >>> >>> -- >>> С уважением >>> Николай Мишин >>> >>> -- >>> Moscow.pm mailing list >>> [email protected] | http://moscow.pm.org >> , >> >> -- >> Moscow.pm mailing list >> [email protected] | http://moscow.pm.org > > -- > С уважением > Николай Мишин > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
