use utf8 gives me 'Wide character in print'

use utf8 gives me 'Wide character in print'

如果我运行下面的程序  

[oracle@oadb utf-8]$ perl -e 'use utf8; print "鸡
";print length("鸡
")."
"'
Wide character in print at -e line 1.
鸡
2

我得到这个警告:

Wide character in print at -e line 1.

如果我运行 这个程序:

[oracle@oadb utf-8]$ perl -e ' print "鸡
";print length("鸡
")."
"'
鸡
4

我不会得到警告:


我认为 use utf8 是需要使用utf8 字符在一个Perl脚本,为什么这个不起作为 我该如何解决


没有use utf8 解释你的脚本作为一个单字节字符顺序,那么这里有4个字节在你的字符串里

[oracle@oadb utf-8]$ perl -E 'say join ":", map { ord } split //, "鸡
";'
233:184:161:10

前3个字节组成了你的字符(鸡),最后一个是换行符


这个调用打印发送那些4个字符到STDOUT, 你的控制台然后

制定如何显示那些字符。如果你的控制台设置为UTF-8,那么它会解释那3个字节作为一个单独的字符


如果 你增加use utf8,事情就不同了, 在这种情况下,Perl解释你的字符串作为2个字符


[oracle@oadb utf-8]$  perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡
";'
40481:10


默认情况下,Perl的 IO layer 假设 它是和单字节字符一起工作。

因此当你尝试打印一个多字节的字符, Perl 想 这里有什么错误 给你一定警告

(S utf8)  Perl 遇到一个宽字符(>255) 当他没有想到的。

这个警告是默认启用用于I/O(像print)


最简单的方式减轻这个警告是简单的增加 utf8 layer 到输出

例如 binmode STDOUT, ':utf8'. 

另外一个方式是关闭警告 增加  no warnings 'utf8';

原文地址:https://www.cnblogs.com/hzcya1995/p/13349825.html