<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: regexp  + UTF-8 = не работает</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html</link>
    <description>Добрый день, уважаемые.&lt;br&gt;&lt;br&gt;Подскажите пожалуйста почему Perl не парсит рег.выражения на русском вида &#091;а-яА-Я&#093; при использовании UTF8. Хотя с CP1251 проблем нет(если делаю iconv + использую setlocale(LC_CTYPE,&quot;ru_RU.CP1251&quot;);&lt;br&gt;&lt;br&gt;Имею:&lt;br&gt;$ locale&lt;br&gt;LANG=ru_RU.UTF-8&lt;br&gt;LC_CTYPE=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_NUMERIC=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_TIME=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_COLLATE=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_MONETARY=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_MESSAGES=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_PAPER=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_NAME=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_ADDRESS=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_TELEPHONE=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_MEASUREMENT=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_IDENTIFICATION=&quot;ru_RU.UTF-8&quot;&lt;br&gt;LC_ALL=&lt;br&gt;&lt;br&gt;Файл, к-ый хочу пропарсить имеет строки вида:&lt;br&gt;&quot;Администратор&quot; &quot;Марфа Васильевна&quot;&lt;br&gt;Естественно он сохранен в UTF-8&lt;br&gt;&lt;br&gt;Мой скрипт:&lt;br&gt;#!/usr/bin/perl&lt;br&gt;&lt;br&gt;use strict;&lt;br&gt;use warnings;&lt;br&gt;&lt;br&gt;open(DATA,&apos;file.txt&apos;);&lt;br&gt;my $infile = &amp;lt;DATA&amp;gt;;&lt;br&gt;close DATA;&lt;br&gt;&lt;br&gt;while($infile =~ m/(&#091;А-Яа-я&#093;+)/gi) &#123;&lt;br&gt;        print &quot;$1&#092;n&quot;;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;На выходе получаю:&lt;br&gt;$ perl report.pl&lt;br&gt;Админи&lt;br&gt;&lt;br&gt;&lt;br&gt;а&lt;br&gt;о&lt;br&gt;Ма&lt;br&gt;&lt;br&gt;а&lt;br&gt;Ва&lt;br&gt;ил&lt;br&gt;евна&lt;br&gt;&lt;br&gt;В чем трабла?&lt;br&gt;На википедии написано что с юн</description>

<item>
    <title>regexp  + UTF-8 = не работает (oklas)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#10</link>
    <pubDate>Thu, 21 Aug 2014 06:53:04 GMT</pubDate>
    <description>- никаких проблем с использовнием utf8 в перл не возникает,&lt;br&gt;  и в частности в связи с тем что кодировка мультибайтовая.&lt;br&gt;&lt;br&gt;- тормознутой кодировка быть не может, могут быть тормознутыми&lt;br&gt;  алгоритмы (работающие с данными в разных кодировках).&lt;br&gt;&lt;br&gt;- на этапе обучения всегда бывают вопросы, здесь и есть их место.&lt;br&gt;&lt;br&gt;- если есть данные о несоответствии поведения перл описанному&lt;br&gt;  в документации пишите разработчикам перл.&lt;br&gt;&lt;br&gt;- &quot;люди с таким упрорством пытаются использовать&quot; - это вы видимо&lt;br&gt;  про разработчиков таких систем как google yandex rambler и т.д.&lt;br&gt;</description>
</item>

<item>
    <title>regexp  + UTF-8 = не работает (Анатолий)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#9</link>
    <pubDate>Thu, 21 Aug 2014 05:47:09 GMT</pubDate>
    <description>А вы не пробовали задать другую локаль к примеру вызвав функцию setlocale? И у вас сразу всё станет настроено на другой язык и другую кодировку.. Так же легко перестроить среду с которой вы работаете, к примеру редактор, сообщения об ошибках и т.п.  Да хоть всю систему если надо... Если у вас нет соотвствующей локализации для perl а ид программ, то их легко скачать с интернета и установить!!! Это же свободное ПО и там есть все мыслимые и немыслимые локализации!!! Ну в крайнем случае можете написать свою... Но нафига, если есть готовая!&lt;br&gt;</description>
</item>

<item>
    <title>regexp  + UTF-8 = не работает (Анатолий)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#8</link>
    <pubDate>Thu, 21 Aug 2014 05:38:03 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; $bytes = encode(&apos;utf-8&apos;, $string); # в байты, (из внутреннего формата) &lt;br&gt;&amp;gt; $string = decode(&apos;utf-8&apos;, $bytes); # преобразовать во внутренний формат &lt;br&gt;&amp;gt; ! ВАЖНО, если perl собран и операционная система настроена так, что внутреннее &lt;br&gt;&amp;gt; представление переменных в utf-8 и print&apos;ы и прочее выводят в utf-8, &lt;br&gt;&amp;gt; то это не значит что не надо пропускать через decode( &apos;utf-8&apos;, &lt;br&gt;&amp;gt; ... ), строки пришедшие откуда-то (из socket&apos;а или fcgi, или модуля &lt;br&gt;&amp;gt; какого-нибудь и т.п.) то что строка в utf-8 еще не значит &lt;br&gt;&amp;gt; что она во внутреннем формате.&lt;br&gt;&amp;gt; При работе с файлами можно использовать специальный синтаксис при открытии: &lt;br&gt;&amp;gt; open FH, &quot;&amp;lt;:utf8&quot;, $filename; # подробнее &quot;perldoc -f open&quot; &lt;br&gt;&lt;br&gt;Мне странно читать подобные недовольсва... некоторые абсолютно уверены, что это какая-то ошибка и потому не рабоате! Нет граждане непонимающие это не ошибка... И оно не должно работать Просто потому что всё это работает через ctype функции... А  они не работают с мультибайтовыми кодировками! Ещё более странно д</description>
</item>

<item>
    <title>regexp  + UTF-8 = не работает (oklas)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#7</link>
    <pubDate>Tue, 03 Dec 2013 11:53:24 GMT</pubDate>
    <description>В перле к строкам прикручены внутренние флаги, в частности есть флаг что строка во внутреннем формате, только с этим форматом нормально работают регулярные выражения и всякие там length и т.п.&lt;br&gt;&lt;br&gt;Большинство проблем с кодировками можно решить придерживаясь например такой схемы работы:&lt;br&gt;&lt;br&gt;use utf8; # предписывает что константы и регулярные выражения, имеющие не-ASCII символы, &lt;br&gt;должны трактоваться как уникодные и приводиться ко внутреннему формату&lt;br&gt;&lt;br&gt;use Encode; # включаем модуль работы с кодировками.&lt;br&gt;&lt;br&gt;$bytes = encode(&apos;utf-8&apos;, $string); # в байты, (из внутреннего формата)&lt;br&gt;$string = decode(&apos;utf-8&apos;, $bytes); # преобразовать во внутренний формат&lt;br&gt;&lt;br&gt;! ВАЖНО, если perl собран и операционная система настроена так, что внутреннее представление переменных в utf-8 и print&apos;ы и прочее выводят в utf-8, то это не значит что не надо пропускать через decode( &apos;utf-8&apos;, ... ), строки пришедшие откуда-то (из socket&apos;а или fcgi, или модуля какого-нибудь и т.п.) то что строка в utf-8 еще не значит что она во внутреннем формате.</description>
</item>

<item>
    <title>regexp  + UTF-8 = не работает (angra)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#6</link>
    <pubDate>Thu, 12 Mar 2009 23:14:16 GMT</pubDate>
    <description>Ну не все же одновременно надо было добавлять. Кроме того utf8::upgrade($infile); перед использованием my $infile вообще не имеет смысла. Используйте use strict дабы избегать таких ошибок. &lt;br&gt;Попробуйте такой вариант:&lt;br&gt;#!/usr/bin/perl -w&lt;br&gt;use strict;&lt;br&gt;&lt;br&gt;use utf8;&lt;br&gt;&lt;br&gt;open(DATA,&apos;file.txt&apos;);&lt;br&gt;my $infile = &amp;lt;DATA&amp;gt;;&lt;br&gt;utf8::decode($infile);&lt;br&gt;close DATA;&lt;br&gt;&lt;br&gt;while($infile =~ m/(&#091;А-Яа-я&#093;+)/gi) &#123;&lt;br&gt;  my $s=$1;&lt;br&gt;  #нельзя напрямую применять encode к $1 иначе получим бред после первой строки&lt;br&gt;  utf8::encode($s);&lt;br&gt;  print &quot;$s&#092;n&quot;;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;А вообще работа с юникодом в перле(да и в большинстве других языков) это шаманство, особенно когда много _различных_ потоков ввода/вывода. &lt;br&gt;</description>
</item>

<item>
    <title>regexp  + UTF-8 = не работает (Аноним но другой)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#5</link>
    <pubDate>Thu, 12 Mar 2009 22:52:44 GMT</pubDate>
    <description>&amp;gt;man perluniintro &lt;br&gt;&amp;gt;man perlunifaq &lt;br&gt;&amp;gt;man perlunitut &lt;br&gt;&amp;gt;man perlunicode &lt;br&gt;&amp;gt;Можно начать с попытки добавлять &lt;br&gt;&amp;gt;use utf8; &lt;br&gt;&amp;gt;use open &apos;:encoding(utf8)&apos;; &lt;br&gt;&amp;gt;utf8::upgrade($infile); &lt;br&gt;&amp;gt;Если не получится, то придется таки читать. &lt;br&gt;&lt;br&gt;Добавил, теперь скрипт выглядит так:&lt;br&gt;$ less report.pl&lt;br&gt;#!/usr/bin/perl&lt;br&gt;&lt;br&gt;use utf8;&lt;br&gt;use open &apos;:encoding(utf8)&apos;;&lt;br&gt;utf8::upgrade($infile);&lt;br&gt;&lt;br&gt;open(DATA,&apos;file.txt&apos;);&lt;br&gt;my $infile = &amp;lt;DATA&amp;gt;;&lt;br&gt;close DATA;&lt;br&gt;&lt;br&gt;while($infile =~ m/(&#091;А-Яа-я&#093;+)/gi) &#123;&lt;br&gt;        print &quot;$1&#092;n&quot;;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;$ less file.txt&lt;br&gt;&quot;Администратор&quot; &quot;Марфа Васильевна&quot;&lt;br&gt;&lt;br&gt;$ ./report.pl&lt;br&gt;Wide character in print at page.analyser_simplified.pl line 12.&lt;br&gt;Администратор&lt;br&gt;Wide character in print at page.analyser_simplified.pl line 12.&lt;br&gt;Марфа&lt;br&gt;Wide character in print at page.analyser_simplified.pl line 12.&lt;br&gt;Васильевна&lt;br&gt;&lt;br&gt;Работает!! Спасибо. Осталось теперь тока разобраться с руганью про wide character.&lt;br&gt;завтра почитаю. спасибо.&lt;br&gt;</description>
</item>

<item>
    <title>regexp  + UTF-8 = не работает (gaa)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#4</link>
    <pubDate>Thu, 12 Mar 2009 22:25:20 GMT</pubDate>
    <description>&amp;gt;&amp;gt;И обычно во всех регекспах есть спецпоследовательность для обозначения любого набора букв. &lt;br&gt;&amp;gt;&amp;gt;Что-то вроде &#091;&#091;:alnum:&#093;&#093; или &#092;w, уж не знаю как в перле. &lt;br&gt;&amp;gt;Это по умолчанию только для английских, причем не только в перле.&lt;br&gt;&lt;br&gt;В тикле под &#092;w и &#091;&#091;:alpha:&#093;&#093; буквы из русской локали тоже подходят. Так что надо читать ман по конкретному языку.&lt;br&gt;</description>
</item>

<item>
    <title>regexp  + UTF-8 = не работает (angra)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#3</link>
    <pubDate>Thu, 12 Mar 2009 21:54:52 GMT</pubDate>
    <description>&amp;gt;И обычно во всех регекспах есть спецпоследовательность для обозначения любого набора букв. &lt;br&gt;&amp;gt;Что-то вроде &#091;&#091;:alnum:&#093;&#093; или &#092;w, уж не знаю как в перле. &lt;br&gt;&lt;br&gt;Это по умолчанию только для английских, причем не только в перле. Кроме того в эти классы цифры тоже входят, а в &#092;w еще и подчеркивание. &lt;br&gt;Перл позволяет работать с возможностями isalpha для локалей, в том числе и utf8, но для этого нужно явно указывать use locale.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>regexp  + UTF-8 = не работает (gaa)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8150.html#2</link>
    <pubDate>Thu, 12 Mar 2009 18:46:49 GMT</pubDate>
    <description>&amp;gt;Мой скрипт: &lt;br&gt;&amp;gt;#!/usr/bin/perl &lt;br&gt;&lt;br&gt;В какой кодировке файл скрипта сохранён?&lt;br&gt;&lt;br&gt;И обычно во всех регекспах есть спецпоследовательность для обозначения любого набора букв. Что-то вроде &#091;&#091;:alnum:&#093;&#093; или &#092;w, уж не знаю как в перле.&lt;br&gt;</description>
</item>

</channel>
</rss>
