Запись однострочных Unicode в Perl
Каков правильный способ записи Unicode-совместимых однострочных в Perl? Очевидный способ:
$ echo 'フーバー' | perl -lne 'print if /フ/'
フーバー
... вид, похоже, срабатывает с первого взгляда, но это просто случайность: Unicode интерпретируется как байты, как показывает следующий пример:
$ echo 'フーバー != フウバー' | perl -mString::Diff=diff -lne 'print join(" ", diff($1, $2)) if /(.*)!=(.*)/' => 29
フ?[??]バー[ ] { }フ?{??}バー
Просто использование флага -C
для установки STDIN
/STDOUT
и т.д. для UTF-8 не является само по себе:
$ echo 'フーバー' | perl -C -lne 'print if /フ/'
[no output]
... потому что теперь текст в -e
не интерпретируется как Unicode.
Итак, это способ пойти (предполагая разумный LOCALE, то есть один в форме "*.UTF‑8"
), как это:
$ perl -C -Mutf8 [...]
Ответы
Ответ 1
Да, загрузка utf8
pragma требуется для интерпретации последовательности "フ
" UTF-8 в исходном коде как символ вместо этого как отдельные байты.
Переключатель командной строки Perl -C
и прагма utf8
независимы от языка, но команда shell echo
не является.
Ответ 2
Мне нравится использовать utf8::all
, если мне нужно обрабатывать unicode
echo 'フーバー' | perl -Mutf8::all -lne 'print if /フ/'
PS. используя -C
, вам также нужно указать определенные флаги, AFAIK
Ответ 3
в Windows 7:
chcp 65001
perl -M"charnames':full'" -E "say qq{I \N{HEAVY BLACK HEART} PSGI.}"