[Moscow.pm] 2 all & 2 ruz
Sergey Homenkow
hsw на hsw.pp.ru
Вт Апр 1 12:11:15 PDT 2008
Приветствую!
У самого руки не доходят до подготовки доклада, так что делюсь наработками.
1. http://perldoc.perl.org/Encode.html:
"After $utf8 = decode('foo', $octet); ,
When $octet is... The UTF8 flag in $utf8 is
---------------------------------------------
In ASCII only (or EBCDIC only) OFF"
Проверяем:
#perl -MEncode -e 'print Encode::is_utf8(decode(q{utf-8}, 2+2))'
1
2. С включенным use utf8 perl также нарушает это правило при
преобразовании текста в скаляр:
- (a => 2) - 'a' - будет с флагом utf (обсуждалось в рассылке)
- $a->{a} - аналогично.
Экзотика:
use utf8;
use Devel::Peek;
my %a = ( 'a' => 1, 'b' => 1 );
Dump(\%a);
delete $a{c};
Dump(\%a);
Первый Dump выводит флаги хеша:
FLAGS = (PADBUSY,PADMY,SHAREKEYS)
а второй уже:
FLAGS = (PADBUSY,PADMY,SHAREKEYS,HASKFLAGS)
теперь все ключи хеша содержат дополнительное поле с флагом.
При Storable у хеша другой тип, дополнительный байт на хеш и по
дополнительному байту на каждый ключ.
Вернуть назад нельзя (только копированием данных в другую переменную).
3. Cache::Memcached использует Storable для сериализации, а он сохраняет
флаг utf8. Главное верить.
Memcached.pm:
sub _set()
...
if (ref $val) {
local $Carp::CarpLevel = 2;
$val = Storable::nfreeze($val);
$flags |= F_STORABLE;
}
А для простого скаляра nfreeze() не вызывается.
Строчка записывается как она есть.
При чтении данных из сокета получаем строку без флага utf8.
PS. Тестировал на perl v5.8.8. Некоторое проверял на 5.10.0 - тоже самое.
Vladimir V. Perepelitsa пишет:
> 2 all:
> Если у кого есть глюки или непонятки с utf8, присылайте плиз тесткейсы и
> вопросы. буду дорабатывать доклад к May Perl
Подробная информация о списке рассылки Moscow-pm