perl -e 'use utf8; print "鸡\n";'
我得到这个警告:
Wide character in print at -e line 1.
如果我运行这个Perl程序:
perl -e 'print "鸡\n";'
我没有得到警告。
我认为使用utf8是需要使用utf8字符的Perl脚本。为什么这不工作,如何解决它?我使用Perl 5.16.2。我有同样的问题,如果这是在一个文件,而不是一个线索在命令行。
解决方法
$ perl -E 'say join ":",map { ord } split //,"鸡\n";' 233:184:161:10
前三个字节组成你的字符,最后一个是换行符。
打印调用将这四个字符发送到STDOUT。然后,您的控制台会演示如何显示这些字符。如果您的控制台设置为使用UTF8,那么它会将这三个字节解释为您的单个字符,这是显示的内容。
如果我们在utf8模块中添加,事情是不同的。在这种情况下,Perl将您的字符串解释为只有两个字符。
$ perl -Mutf8 -E 'say join ":","鸡\n";' 40481:10
默认情况下,Perl的IO层假定它使用单字节字符。所以当你尝试打印一个多字节字符时,Perl认为有些东西是错误的,并给你一个警告。与以往一样,您可以通过包括使用诊断来获取此错误的更多说明。它会说:
(S utf8) Perl met a wide character (>255) when it wasn’t expecting
one. This warning is by default on for I/O (like print). The easiest
way to quiet this warning is simply to add the :utf8 layer to the
output,e.g. binmode STDOUT,‘:utf8’. Another way to turn off the
warning is to add no warnings ‘utf8’; but that is often closer to
cheating. In general,you are supposed to explicitly mark the
filehandle with an encoding,see open and perlfunc/binmode.
正如其他人指出的,你需要告诉Perl接受多字节输出。有很多方法可以做到这一点(参见Perl Unicode Tutorial的一些例子)。最简单的方法之一是使用-CS命令行标志 – 它告诉三个标准文件句柄(STDIN,STDOUT和STDERR)来处理UTF8。
$ perl -Mutf8 -e 'print "鸡\n";' Wide character in print at -e line 1. 鸡
vs
$ perl -Mutf8 -CS -e 'print "鸡\n";' 鸡
Unicode是一个大而复杂的领域。正如你所看到的,许多简单的程序似乎做正确的事情,但是错误的原因。当你开始修复程序的一部分时,事情往往会变得更糟,直到你修复了所有的程序。