<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">Приветствую!</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Небольшой лонгрид. <br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">1) В перле юникодная строка может быть представлена двумя способами:</div><div class="gmail_default" style="font-family:monospace,monospace">   * как последовательность символов с номерами в т.ч. больше 255 - собственно юникод</div><div class="gmail_default" style="font-family:monospace,monospace">   * как последовательность байтов с номерами строго до 255, кодирующая юникодную строку - это utf8</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">   encode_utf8 делает из символов (cyrillic_a и пр) байты (0x0-0xFF)</div><div class="gmail_default" style="font-family:monospace,monospace">   decode_utf8 делает из байтов символы (и дохнет, если ей попался символ > 255)<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Те же символы вызывают warning "wide characters in print". Потому что они не предназначены для IO, IO умеетработать только с байтами (в шине 8 бит на байт и всё!).<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">2) Флаг is_utf8, к сожалению, обозначает нечто противоположное своему названию - то есть, предполагается, что is_utf8=1 это строка символов, а is_utf8=0 это бинарная строка, из которой эти символы можно собрать.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">  См. негодование Леманна по этому поводу в perldoc JSON::XS<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">3) use utf8; означает, что все бинарные последовательности в самом скрипте надо приводить к юникоду. Это то, что вам нужно, потому что<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">4) вам нужно работать именно с символами, для вас [а-я] это маленькая русская буква, а не "половинка а, какой-то бинарный мусор, половинка я". В идеале везде внутри периметра должен быть только юникод, 2018 год на дворе, всё-таки!<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Конец лонгрида<br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Соответственно, (1) проверить, что везде, где есть кириллические литералы, стоит use utf8; - иначе "Лена и Маша" - не два женских имени, а бинарный мусор.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">(2) смотреть, какой флаг is_utf8 у того, что  возвращается из dom. Возможно, где-то в недрах модуля, разбирающего HTML, есть настройка "у нас везде юникод", тогда её надо включить. <br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">По-моему, так. <br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2018-01-11 0:24 GMT+02:00 Sergey Aleynikov via Moscow-pm <span dir="ltr"><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Добрый день,<br>
<br>
И регулярное выражение и строка для поиска должны быть в одинаковой<br>
кодировке с одинаково выставленным флагом UTF8. В лучшем случае - в<br>
utf-8 с выставленным флагом. Ищите, почему в вашем коде это не так.<br>
<br>
Best regards,<br>
Sergey Aleynikov<br>
<br>
<br>
11 января 2018 г., 0:15 пользователь Alex Povolotsky via Moscow-pm<br>
<<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a>> написал:<br>
<div class="HOEnZb"><div class="h5">> Добрый вечер<br>
><br>
> Вытаскиваю страницу с помощью Mojo::UserAgent, получаю $tx->res->dom, и<br>
> пытаюсь сравнивать регекспом со строковыми литералами.<br>
><br>
> $dom->at('h1.title')->text =~ /ой/<br>
><br>
> не работает<br>
><br>
> что совсем непонятно<br>
><br>
> encode('utf-8', $dom->at('h1.title')->text) =~ /ой/<br>
><br>
> в отладчике  возвращает 1, в коде - не отрабатывает.<br>
><br>
> Кто-нибудь это уже борол?<br>
><br>
> Alex<br>
> --<br>
> Moscow.pm mailing list<br>
> <a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div><div><font face="monospace,monospace">Konstantin S. Uvarin<br></font></div><font face="monospace,monospace">jabber: see <from><br></font></div><font face="monospace,monospace">skype: kuvarin<br></font></div><font face="monospace,monospace"><a href="http://github.com/dallaylaen" target="_blank">http://github.com/dallaylaen</a><br></font></div></div>
</div>