Comments 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
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
Проблема наверное в том, что эти символы не относятся к какому-либо символьному классу, например:
Ответом будет \W – yes, хотя на самом деле – это Latin Capital Letter A With Circumflex в Unicode ну или, например, 'В' в cp1251
Вот другой пример:
Обе переменные содержат одинаковое значение.
Когда мы добавляем 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
и не придется мудрить.
Sign up to leave a comment.
Работа с кодировками в Perl