Как стать автором
Обновить

Комментарии 6

Возможные топики для расширения статьи:

1) use utf8 vs use encoding
www.perlmonks.org/index.pl?node_id=668987
www.perlmonks.org/index.pl?node_id=669006

2) Unicode normalization
stackoverflow.com/questions/10651486/can-there-be-2-different-utf-8-encodings-for-the-same-character/10651546#10651546
shiplu.mokadd.im/77/
en.wikipedia.org/wiki/Unicode_equivalence

3) директива use open qw/:std :utf8/;

4) проблемы поддержки unicode в модулях CPAN

5) use bytes
Спасибо, полезная статья. В избранное.
Unicode Bug в Perl

Описанное не является «The „Unicode Bug“ ( perldoc.perl.org/perlunicode.html#The-%22Unicode-Bug%22 ) а просто багом в программе (забыли указать кодировку, и все строки являются байтовыми стриками )

The „Unicode Bug“ это когда Latin1 строка может быть upgraded или downgraded, и интрепретируется как байты, в случае когда downgraded (при этом является символами, с кодом больше 127, без UTF-8 флага — да, именно, полноценный Unicode, без utf8 флага)
да, Unicode Bug нужно будет исправить, его смысл в том, что для символов с кодами от 128 до 255 семантика работает неправильно в старых версиях Perl (хотя в документации и написано, что баг это — … different semantics in byte semantics versus character semantics), но все же с character semantics — вроде бы, все ок.

Когда мы добавляем use feature 'unicode_strings' (или когда это делает неявно Perl в более новых версиях); — строки не стают автоматически храниться во внутреннем формате и не имеют флага UTF-8, но в то же время при таких операциях, как например, uc() — используется unicode semantics (который используется также когда строка имеет флаг UTF-8).

Тот же lc() использует различные семантики — perldoc.perl.org/functions/lc.html

Проблема наверное в том, что эти символы не относятся к какому-либо символьному классу, например:

my $s1 = "\xC2";
no feature 'unicode_strings'; 
print "\\W - yes\n" if ($s1=~/\W/);  # Match non-word character.

Ответом будет \W – yes, хотя на самом деле – это Latin Capital Letter A With Circumflex в Unicode ну или, например, 'В' в cp1251
Вот другой пример:

no feature 'unicode_strings';
my $a = "\xc2";

$b = uc($a);
print $a . "\n";
print $b . "\n";


Обе переменные содержат одинаковое значение.

В примере про LWP проще проверять
$res->is_success

далее, ответ лучше получать методом
$res->decoded_content

и не придется мудрить.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории