加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:28:16 所属栏目:大数据 来源:网络整理
导读:如果我运行下面的Perl程序: perl -e 'use utf8; print "鸡n";' 我得到这个警告: Wide character in print at -e line 1. 如果我运行这个Perl程序: perl -e 'print "鸡n";' 我没有得到警告。 我认为使用utf8是需要使用utf8字符的Perl脚本。为什么这不工
如果我运行下面的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是一个大而复杂的领域。正如你所看到的,许多简单的程序似乎做正确的事情,但是错误的原因。当你开始修复程序的一部分时,事情往往会变得更糟,直到你修复了所有的程序。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读