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

--
Денис Ибаев




-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить