[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