在Perl中编写支持Unicode的单行代码

时间:2012-02-29 10:40:24

标签: perl shell unicode utf-8

在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 [...]

3 个答案:

答案 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)

Windows 7中的

chcp 65001 
perl -M"charnames':full'" -E "say qq{I \N{HEAVY BLACK HEART} PSGI.}"