Подтвердить что ты не робот

Запись однострочных 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 [...]
4b9b3361

Ответ 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.}"