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

as.*_*as. 19 unicode shell perl utf-8

在Perl中编写支持Unicode的单行程序的正确方法是什么?显而易见的方式:

$ echo '????' | perl  -lne 'print if /?/'  
????
Run Code Online (Sandbox Code Playgroud)

...有点似乎是第一眼看到的,但这只是一个意外:Unicode被解释为字节,如下一个示例所示:

$ echo '???? != ????' | perl  -mString::Diff=diff -lne 'print join(" ", diff($1, $2)) if /(.*)!=(.*)/'                                                                                 => 29
??[??]??[ ] { }??{??}??
Run Code Online (Sandbox Code Playgroud)

只使用-C标志将STDIN/ STDOUT 设置为UTF-8本身是不够的:

$ echo '????' | perl -C -lne 'print if /?/' 
[no output]
Run Code Online (Sandbox Code Playgroud)

...因为现在文本-e不被解释为Unicode.

所以这是要走的路(假设一个理智的LOCALE - 即形式中的一个"*.UTF?8"),如下所示:

$ perl -C -Mutf8 [...]
Run Code Online (Sandbox Code Playgroud)

dax*_*xim 17

是的,加载utf8pragma需要?将源代码中的" "UTF-8序列解释为字符而不是单独的字节.

Perl -C命令行开关和utf8pragma是与语言环境无关的,但是shell的echo命令不是.


w.k*_*w.k 8

utf8::all如果我需要处理unicode,我喜欢使用

echo '????' | perl -Mutf8::all -lne 'print if /?/'
Run Code Online (Sandbox Code Playgroud)

PS.使用-C你也需要给出特定的标志,AFAIK

  • [`-C`本身(后面没有任何数字或选项列表)(...)与`-CSDL`具有相同的效果.](http://p3rl.org/run#*-C-%5b_number% 2flist_%5D*) (5认同)