使用“使用UTF-8;” 给我“在打印宽字符”(Use of 'use utf8;

2019-07-20 23:11发布

如果我运行下面的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。 我有同样的问题,如果这是一个文件而不是在命令行上一行。

Answer 1:

如果不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是一个大而复杂的领域。 正如你所看到的,许多简单的程序似乎做正确的事情,但错误的原因。 当您启动修复计划的一部分,事情往往会变得更糟,直到你固定的所有方案。



Answer 2:

所有use utf8; 确实是告诉Perl的源代码是用UTF-8编码。 你需要告诉Perl中如何将文本进行编码:

use open ':std', ':encoding(UTF-8)';


Answer 3:

编码所有标准输出为UTF-8:

binmode STDOUT, ":utf8";


Answer 4:

你可以亲近“只是做UTF8无处不在”使用CPAN模块utf8::all

perl -Mutf8::all -e 'print "鸡\n";'

print接收的东西,它不能打印(字符大于255时没有:encoding提供层),它假定你的意思使用UTF-8来编码它。 它这样做,并警告这个问题之后。



Answer 5:

您可以使用此,

perl -CS filename.

它也将终止这个错误。



Answer 6:

在西班牙,你可以找到这个错误时的身边开始使用:

use utf8;

您编辑的编码是不同的编码。 所以你看到的编辑器是什么Perl不会什么。 为了解决这个错误只是改变编辑器的编码为Unicode / UTF-8。



文章来源: Use of 'use utf8;' gives me 'Wide character in print'