[Moscow.pm] use encoding и манипуляции со строками

Анатолий Гришаев 0body0 на rambler.ru
Пт Апр 24 11:00:11 PDT 2015


24.04.2015 19:54, Denis Ibaev пишет:
> Привет.
>
> Не могу понять, почему в одном случае ниже приведённый скрипт 
> выставляет у строки флаг utf8, а в другом нет. Без прагмы encoding 
> такого эффекта не наблюдается. Может кто-нибудь объяснить?
>
> Вывод скрипта:
>
> v1 is utf-8 = 0
> v2 is utf-8 = 0
> v1 is utf-8 = 1
> v2 is utf-8 = 0

1) Без прагмы "use encoding 'utf-8'" chr() никогда флаг не ставит 
(точнее до 255)
2) С прагмой если код cимвола  < 128 chr флаг ставит, c 128 до 255 не 
ставит, а более 255 ставит.

В принципе какая то логика в этом есть, если считать что chr до 255 
должно возвращать latin-1, но кмк кривая.

Может можно:
1)  починить c помощью use bytes
2)  или испытать магию GLOBAL::CORE::chr = ...
3) BEGIN{ $INC{"encoding.pm"} = "Janky go home" } перед загрузкой твоего 
модуля.




>
> Сам скрипт:
>
> use strict;
> use warnings;
> use v5.12;
> use utf8;
>
> use encoding 'utf-8';
>
> my $v1 = '';
> my $v2 = '';
>
> utf8::downgrade($v1);
> utf8::downgrade($v2);
>
> say 'v1 is utf-8 = ', utf8::is_utf8($v1) || 0;
> say 'v2 is utf-8 = ', utf8::is_utf8($v2) || 0;
>
> $v1 .= chr(hex($_)) for qw(22 D0);
> $v2 .= chr(hex($_)) for qw(D0);
>
> say 'v1 is utf-8 = ', utf8::is_utf8($v1) || 0;
> say 'v2 is utf-8 = ', utf8::is_utf8($v2) || 0;
>
> Окружение:
>
> $ perl -v
> This is perl 5, version 14, subversion 2 (v5.14.2) built for 
> x86_64-linux-gnu-thread-multi
> (with 57 registered patches, see perl -V for more detail)
>
> $ perl -MEncode -E 'say Encode->VERSION'
> 2.73
>
> -- 
> Денис Ибаев
>
>
>

----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150424/d6059b0e/attachment.html>


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