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';