perl – 使用utf8给我’宽字符打印’
如果我运行下面的Perl程序:
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。我有同样的问题,如果这是在一个文件,而不是一个线索在命令行。 解决方法
不使用utf8 Perl将您的字符串解释为单字节字符序列。您的字符串中有四个字节,您可以从中看到:
$ 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认为有些东西是错误的,并给你一个警告。与以往一样,您可以通过包括使用诊断来获取此错误的更多说明。它会说:
正如其他人指出的,你需要告诉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是一个大而复杂的领域。正如你所看到的,许多简单的程序似乎做正确的事情,但是错误的原因。当你开始修复程序的一部分时,事情往往会变得更糟,直到你修复了所有的程序。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |