perl中的-C标志号使UTF-8"正常工作"?

时间:2015-05-21 06:31:30

标签: perl utf-8 utf8-decode

我的设置:perl-5.20.2,UTF-8环境。

考虑以下两个bash示例。第一个工作正常,第二个工作没有。

echo -n 'привет мир' | perl -MEncode -le '$a=decode("utf8",<>); $x=decode("utf8","мир"); print encode("utf8",sprintf("% 11s",$a)) if $a=~/$x/'|grep -q ' привет мир' && echo OK
for (( i=0; $i < 512; i=$((i+1)) )); do echo -n 'привет мир' | perl -C$i -le '$a=<>; print sprintf("% 11s",$a) if $a=~/мир/' | grep -q ' привет мир' && echo $i; done

为什么在案例2中没有-C标志号,这使得该示例至少工作一次?

1 个答案:

答案 0 :(得分:4)

  

为什么没有-C标志号...这使得该示例至少工作一次?

因为在Perl源中使用UTF-8文字需要use utf8;

for (( i=0; $i < 512; i=$((i+1)) )); do echo -n 'привет мир' | perl -C$i -le 'use utf8; $a=<>; print sprintf("% 11s",$a) if $a=~/мир/' | grep -q ' привет мир' && echo $i; done

没有复制-C的{​​{1}}值。使用use utf8; use utf8的任何奇数值都会通过测试(STDIN假定为UTF-8),但是你会得到一个&#34;宽字符&#34;警告,除非您还将STDOUT设置为UTF-8。

因此,-C和任何数字-C3一样有效。对于1-liners,您可能希望$i % 4 == 3-CSDA)表示所有I / O和-C63都应为UTF-8。

您还可以使用@ARGV选项,而不是将-Mutf8放入1-liner。 use utf8;不起作用,因为它等同于-mutf8并且parens阻止调用use utf8 ();方法。由于import方法将源代码标记为UTF-8,import不执行任何操作。但-mutf8相当于-Mutf8,因此可行。

但是,将use utf8;放入-Mutf8可能会破坏使用非ASCII ISO-8859-1文字的任何脚本。这可能是您愿意承担的风险,但您应该了解它。