<HTML><BODY>Здравствуйте, Виктор!<br><br>Убедил. (Прошу разрешения называть вас на "ты") Теперь я буду говорить так:<br><br>Строки в Perl существуют во внутреннем формате, который называется utf8.<br><br>Все данные в Perl поступают в бинарном виде, т.е. Perl их интерпретирует<br>как набор байтов.<br><br>Чтобы Perl понял, что бинарные данные являются строкой, эти данные нужно<br>декодировать с помощью Encode::decode('UTF-8', $bin).<br><br>Чтобы вывести строки из Perl, их нужно закодировать в бинарный вид так:<br>Encode::encode('UTF-8', $str)<br><br>Теперь у меня все в порядке с терминологией?<br><br>С почтением,<br>  Илья Винокуров.<br><br><br>Tue, 23 Sep 2014 13:19:49 +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_14114641410000000014_BODY">23 сентября 2014 г., 12:48 пользователь Илья Винокуров <<a href="/compose?To=ilvin@mail.ru">ilvin@mail.ru</a>> написал:<br>
> Здравствуйте, Виктор.<br>
><br>
> Терминология действительно сильно упрощенная, так как<br>
> внутреннее представление строки Perl проще назвать еще одной кодировкой,<br>
> с которой нужно работать, чем копаться в кишках.<br>
<br>
Не согласен. Термин "кодировка" к этому нельзя применять. Когда речь<br>
идёт о кодировке - речь идёт о бинарных данных (байтах).<br>
Символы же это не байлы - это элементы, код у которых может быть<br>
больше 255. Так же в Perl чётко идеологически разграничены операции<br>
над текстом и над бинарными данными.<br>
А именно есть операции которые думают что их операнды текст (регэкспы,<br>
вывод в файл у которго стоит binmode encoding), есть операции которые<br>
думают что их операнды - байты (вывод в файл где нет binmode encoding,<br>
функции типа pack). Это всё нельзя уложить в концепцию кодировок.<br>
<br>
символы vs байты определены здесь<br>
<a href="http://search.cpan.org/~shay/perl-5.20.1/pod/perlunitut.pod#Text_strings_%28character_strings%29" target="_blank">http://search.cpan.org/~shay/perl-5.20.1/pod/perlunitut.pod#Text_strings_%28character_strings%29</a><br>
<br>
><br>
> Вот попробуй человеку объяснить зачем нужно для строки в UTF-8 кодировке<br>
> делать Encode::decode('UTF-8', $string). А когда говоришь, что у Perl своя<br>
> кодировка,<br>
> так сразу человек начинает правильно перекодировать строки... А без этой<br>
> абстракции человек лезет флаги строкам устанавливать...<br>
<br>
Может новичку это поможет на ранней стадии только потом помешает.<br>
Если бы концепция про кодировки была верная, можно было бы<br>
конвертировать между кодировками с помощью Encode::from_to,<br>
и вообще не понятно API когда делаются две функции<br>
Encode::decode/encode чтобы конвертировать из/в кодировку.<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" target="_blank">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>
1) Есть кодировка "UTF-8" и "utf8". Когда декодируют первую, принимают<br>
во внимание то что не все Unicode символы существуют в прикоде. Когда<br>
декодируют вторую, это игнорируется,<br>
т.е. вторая используется как "кодек" похожий на UTF-8 для произвольных<br>
(бинарных !) данных а не текста.<br>
<br>
2) Внутрненний формат строки в perl, когда у ней установлен UTF-8<br>
флаг, является не строгим вариантом UTF-8, т.е. в ней могут<br>
содержаться вообще не символы, просто набор чисел закодированных в<br>
кодек UTF8, не являющийся валидным UTF-8 но с точки зрения перл<br>
полностью валидным.<br>
<br>
например perl -e 'print v100.2000.3000'<br>
<br>
v100.2000.3000 - это строка из трёх элементов: 100, 2000 и 3000.<br>
закодированна этим кодеком. без оглядки на то есть ли в стандарте<br>
unicode эти символы. так можно закодировать произвольные числа. т.е.<br>
UTF8<br>
как бы используется perl не по назначению.<br>
<br>
именно поэтому написан этот параграф.<br>
<br>
<br>
<br>
><br>
> С почтением,<br>
>   Илья Винокуров.<br>
><br>
><br>
> Mon, 22 Sep 2014 12:58:13 +0400 от Victor Efimov <<a href="/compose?To=victor@vsespb.ru">victor@vsespb.ru</a>>:<br>
><br>
> 22 сентября 2014 г., 12:51 пользователь Илья Винокуров <<a href="/compose?To=ilvin@mail.ru">ilvin@mail.ru</a>><br>
> написал:<br>
>> Здравствуйте, Николай.<br>
>><br>
>> Внутри Perl строки хранятся в кодировке, совместимой с UTF-8. Эта<br>
>> кодировка<br>
>> называется utf8.<br>
>> Когда строки вводятся в Perl, их нужно декодировать из различных кодировок<br>
>> в<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>
>><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>
>><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>
><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>