如果我运行下面的Perl程序:
perl -e 'use utf8; print "鸡\n";'
我得到这样的警告:
Wide character in print at -e line 1.
如果我运行这个Perl程序:
perl -e 'print "鸡\n";'
我没有得到警告。
我想use utf8
被要求在一个Perl脚本使用UTF-8字符。 为什么这不是工作,我该如何解决? 我使用Perl 5.16.2。 我有同样的问题,如果这是一个文件而不是在命令行上一行。
如果不use utf8
的Perl解释你的字符串作为单字节字符的序列。 有四个字节的字符串作为你由此可以看出:
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
前三个字节弥补你的性格,最后一个是换行。
要将呼叫print
这四个字符发送到标准输出。 您的控制台,然后工作如何显示这些字符。 如果您的控制台设置为使用UTF-8,那么它会解释这三个字节作为单个字符,这是显示的内容。
如果我们中添加utf8
模块,情况就不同了。 在这种情况下,Perl的解释你的字符串作为只有两个字符。
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
默认情况下,Perl的IO层假定它正在与单字节字符。 所以,当您尝试打印多字节字符,Perl中认为,什么是错的,并给你一个警告。 与以往一样,你可以通过包括得到这个错误的详细解释use diagnostics
。 它会这样说:
(S UTF8)的Perl遇到了一个宽字符(> 255),当它并没有指望之一。 此警告在默认情况下对I / O(如打印)。 安静此警告的最简单方法就是在添加:UTF8层到输出,如binmode STDOUT,“:UTF8”。 关闭该警告的另一种方法是添加任何警告“UTF8”; 但是,往往是更接近于作弊。 在一般情况下,你应该明确地标记与编码的文件句柄,看开和perlfunc / binmode。
正如其他人所指出的,你需要告诉Perl来接受多字节输出。 有很多方法可以做到这一点(见Perl的Unicode教程的一些例子)。 其中一个最简单的方法是使用-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是一个大而复杂的领域。 正如你所看到的,许多简单的程序似乎做正确的事情,但错误的原因。 当您启动修复计划的一部分,事情往往会变得更糟,直到你固定的所有方案。
所有use utf8;
确实是告诉Perl的源代码是用UTF-8编码。 你需要告诉Perl中如何将文本进行编码:
use open ':std', ':encoding(UTF-8)';
你可以亲近“只是做UTF8无处不在”使用CPAN模块utf8::all
。
perl -Mutf8::all -e 'print "鸡\n";'
当print
接收的东西,它不能打印(字符大于255时没有:encoding
提供层),它假定你的意思使用UTF-8来编码它。 它这样做,并警告这个问题之后。
在西班牙,你可以找到这个错误时的身边开始使用:
use utf8;
您编辑的编码是不同的编码。 所以你看到的编辑器是什么Perl不会什么。 为了解决这个错误只是改变编辑器的编码为Unicode / UTF-8。