perl – 使用utf8给我’宽字符打印’

前端之家收集整理的这篇文章主要介绍了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认为有些东西是错误的,并给你一个警告。与以往一样,您可以通过包括使用诊断来获取错误的更多说明。它会说:

(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是一个大而复杂的领域。正如你所看到的,许多简单的程序似乎做正确的事情,但是错误的原因。当你开始修复程序的一部分时,事情往往会变得更糟,直到你修复了所有的程序。

猜你在找的Perl相关文章