[Moscow.pm] Mojo::UserAgent, utf8 и regexp: я что-то запутался

Konstantin S. Uvarin khedin на gmail.com
Ср Янв 10 14:46:33 PST 2018


Приветствую!

Небольшой лонгрид.

1) В перле юникодная строка может быть представлена двумя способами:
   * как последовательность символов с номерами в т.ч. больше 255 -
собственно юникод
   * как последовательность байтов с номерами строго до 255, кодирующая
юникодную строку - это utf8

   encode_utf8 делает из символов (cyrillic_a и пр) байты (0x0-0xFF)
   decode_utf8 делает из байтов символы (и дохнет, если ей попался символ >
255)

Те же символы вызывают warning "wide characters in print". Потому что они
не предназначены для IO, IO умеетработать только с байтами (в шине 8 бит на
байт и всё!).

2) Флаг is_utf8, к сожалению, обозначает нечто противоположное своему
названию - то есть, предполагается, что is_utf8=1 это строка символов, а
is_utf8=0 это бинарная строка, из которой эти символы можно собрать.

  См. негодование Леманна по этому поводу в perldoc JSON::XS

3) use utf8; означает, что все бинарные последовательности в самом скрипте
надо приводить к юникоду. Это то, что вам нужно, потому что

4) вам нужно работать именно с символами, для вас [а-я] это маленькая
русская буква, а не "половинка а, какой-то бинарный мусор, половинка я". В
идеале везде внутри периметра должен быть только юникод, 2018 год на дворе,
всё-таки!

Конец лонгрида

Соответственно, (1) проверить, что везде, где есть кириллические литералы,
стоит use utf8; - иначе "Лена и Маша" - не два женских имени, а бинарный
мусор.

(2) смотреть, какой флаг is_utf8 у того, что  возвращается из dom.
Возможно, где-то в недрах модуля, разбирающего HTML, есть настройка "у нас
везде юникод", тогда её надо включить.

По-моему, так.


2018-01-11 0:24 GMT+02:00 Sergey Aleynikov via Moscow-pm <moscow-pm на pm.org>:

> Добрый день,
>
> И регулярное выражение и строка для поиска должны быть в одинаковой
> кодировке с одинаково выставленным флагом UTF8. В лучшем случае - в
> utf-8 с выставленным флагом. Ищите, почему в вашем коде это не так.
>
> Best regards,
> Sergey Aleynikov
>
>
> 11 января 2018 г., 0:15 пользователь Alex Povolotsky via Moscow-pm
> <moscow-pm на pm.org> написал:
> > Добрый вечер
> >
> > Вытаскиваю страницу с помощью Mojo::UserAgent, получаю $tx->res->dom, и
> > пытаюсь сравнивать регекспом со строковыми литералами.
> >
> > $dom->at('h1.title')->text =~ /ой/
> >
> > не работает
> >
> > что совсем непонятно
> >
> > encode('utf-8', $dom->at('h1.title')->text) =~ /ой/
> >
> > в отладчике  возвращает 1, в коде - не отрабатывает.
> >
> > Кто-нибудь это уже борол?
> >
> > Alex
> > --
> > Moscow.pm mailing list
> > moscow-pm на pm.org | http://moscow.pm.org
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
Konstantin S. Uvarin
jabber: see <from>
skype: kuvarin
http://github.com/dallaylaen
----------- следующая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20180111/6a189066/attachment.html>


Подробная информация о списке рассылки Moscow-pm