在Perl中编写支持Unicode的单行程序的正确方法是什么?显而易见的方式:
$ 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 [...]
答案 0 :(得分:17)
是的,加载utf8
pragma需要将源代码中的“フ
”UTF-8序列解释为字符而不是单独的字节。
Perl -C
命令行开关和utf8
pragma是区域设置无关的,但shell的echo
命令不是。
答案 1 :(得分:7)
如果我需要处理unicode
,我喜欢使用utf8::all
echo 'フーバー' | perl -Mutf8::all -lne 'print if /フ/'
PS。使用-C
你也需要提供特定的标志,AFAIK
答案 2 :(得分:0)
:
chcp 65001
perl -M"charnames':full'" -E "say qq{I \N{HEAVY BLACK HEART} PSGI.}"