<HTML><BODY>Здравствуйте, Виктор.<br><br>Терминология действительно сильно упрощенная, так как<br>внутреннее представление строки Perl проще назвать еще одной кодировкой,<br>с которой нужно работать, чем копаться в кишках.<br><br>Вот попробуй человеку объяснить зачем нужно для строки в UTF-8 кодировке<br>делать Encode::decode('UTF-8', $string). А когда говоришь, что у Perl своя кодировка,<br>так сразу человек начинает правильно перекодировать строки... А без этой<br>абстракции человек лезет флаги строкам устанавливать...<br><br>И такой ход мыслей у многих людей, так что здесь<br><a href="http://search.cpan.org/~shay/perl-5.20.1/pod/perlunifaq.pod#What%27s_the_difference_between_UTF-8_and_utf8?">http://search.cpan.org/~shay/perl-5.20.1/pod/perlunifaq.pod#What%27s_the_difference_between_UTF-8_and_utf8?</a><br>Плюнули и согласились:<br>Okay, if you insist: the "internal format" is utf8, not UTF-8.<br><br>С почтением,<br>  Илья Винокуров.<br><br><br>Mon, 22 Sep 2014 12:58:13 +0400 от Victor Efimov <victor@vsespb.ru>:<br>
<blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;">
        <div id="">
        



    









        
        


        
        
        
        
        

        
        

        
        



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

        
</div>


</div>
</blockquote>
<br></BODY></HTML>