Прежде чем кто будет говорит мне RTFM, я должен сказать, - я выкопал через:Внутренности Perl Unicode - связывайтесь с utf8
- Why does modern Perl avoid UTF-8 by default?
- Checklist for going the Unicode way with Perl
- How to match string with diacritic in perl?
- How to make "use My::defaults" with modern perl & utf8 defaults?
- и многие другие (например, perluniintro и другие) - но - конечно, пропущено что-то
Итак, основной код:
use 5.014; #getting 'unicode_strings' feature
use uni::perl; #turning on many utf8 things
use Unicode::Normalize qw(NFD NFC);
use warnings;
while(<>) {
chomp;
my $data = NFD($_);
say "OK" if utf8::is_utf8($data);
}
На данный момент, отutf8 кодируются STDIN я получил правильный юникода строку в $data
, например, «\ w» будет соответствовать multibyte [\p{Alphabetic}\p{Decimal_Number}\p{Letter_Number}]
(может быть, что-то еще). Это нормально и работает.
AFAIK $data
делает не содержат utf8, но строка в формате perl's internal Unicode
.
Теперь вопросы:
- Как я могу убедиться (проверить это), что любой
$other_data
содержит допустимую строку Unicode? - С какой целью является utf8 :: is_utf8 ($ data)? Вся прагма для меня - загадка.
Я понимаю, что use utf8;
только для того, чтобы сказать Perl, что мой исходный код находится в utf8 (так делают подобные вещи, как, когда мой сценарий начинается с флагом BOM - для BigEndian) - с точки Perl зрения, мой исходный код похож на внешний файл - и Perl должен знать, в какой кодировке он ...
В приведенном выше примере utf8::is_utf8($data)
будет печатать OK - но я не понимаю ПОЧЕМУ.
Внутренне Perl не использует utf8, поэтому мой utf8 данных файл преобразуется во внутренний Unicode в Perl, так почему же utf8::is_utf8($data)
возвращение верно для $data
, который не в формате utf8? Или это неправильно, и функция должна быть названа uni :: is_unicode ($ data) ???
Заранее благодарим за разъяснения.
Ps: d @ Брайан Фой - да, я до сих пор не имеют Эффективное Perl Программирование книги - Я понимаю, - я обещаю :)/шучу/
Пропустил ли я что-нибудь? – ikegami
@ cajwine, Некоторые грамматические ошибки в вашем ответе затрудняют понимание. Я добавил немного к самому началу моего сообщения, которое должно подчеркнуть, что важно. – ikegami
@ cajwine, я добавил к своему ответу: «Вся прагма utf8 для меня загадка.«поскольку вы, очевидно, не говорите о« использовании utf8; ». – ikegami