当前位置:  开发笔记 > 编程语言 > 正文

如何使用菱形运算符(<>)读取UTF-8?

如何解决《如何使用菱形运算符(<>)读取UTF-8?》经验,为你挑选了3个好方法。

我想在Perl中读取UTF-8输入,无论它来自标准输入还是来自文件,使用菱形运算符:while(<>){...}.

所以我的脚本应该像往常一样以这两种方式调用,给出相同的输出:

./script.pl utf8.txt
cat utf8.txt | ./script.pl

但产出不同!只有第二次调用(使用cat)似乎按设计工作,正确读取UTF-8.这是脚本:

#!/usr/bin/perl -w

binmode STDIN, ':utf8';
binmode STDOUT, ':utf8';

while(<>){
    my @chars = split //, $_;
    print "$_\n" foreach(@chars);
}

在两种情况下如何才能正确读取UTF-8?<>如果可能的话,我想继续使用钻石操作员进行阅读.

编辑:

我意识到我应该描述不同的输出.我的输入文件包含以下序列:a\xCA\xA7b.cat正确输出的方法:

a
\xCA\xA7
b

但另一种方法给了我这个:

a
\xC3\x8A
\xC2\xA7
b

potyl.. 58

尝试使用pragma open:

use strict;
use warnings;
use open qw(:std :utf8);

while(<>){
    my @chars = split //, $_;
    print "$_" foreach(@chars);
}

你需要这样做,因为<>运算符是神奇的.如您所知,它将从STDIN或@ARGV中的文件中读取.从STDIN读取没有问题,因为STDIN已经打开,因此binmode可以正常工作.问题是从@ARGV中的文件读取时,当脚本启动并调用binmode时文件未打开.这会导致STDIN设置为UTF-8,但@ARGV有文件时不使用此IO通道.在这种情况下,<>运算符为@ARGV中的每个文件打开一个新的文件句柄.每个文件句柄都会重置并丢失它的UTF-8属性.通过使用pragma open,您可以强制每个新STDIN为UTF-8.



1> potyl..:

尝试使用pragma open:

use strict;
use warnings;
use open qw(:std :utf8);

while(<>){
    my @chars = split //, $_;
    print "$_" foreach(@chars);
}

你需要这样做,因为<>运算符是神奇的.如您所知,它将从STDIN或@ARGV中的文件中读取.从STDIN读取没有问题,因为STDIN已经打开,因此binmode可以正常工作.问题是从@ARGV中的文件读取时,当脚本启动并调用binmode时文件未打开.这会导致STDIN设置为UTF-8,但@ARGV有文件时不使用此IO通道.在这种情况下,<>运算符为@ARGV中的每个文件打开一个新的文件句柄.每个文件句柄都会重置并丢失它的UTF-8属性.通过使用pragma open,您可以强制每个新STDIN为UTF-8.



2> jrockway..:

如果您这样做,您的脚本将起作用:

#!/usr/bin/perl -w

binmode STDOUT, ':utf8';

while(<>){
    binmode ARGV, ':utf8';

    my @chars = split //, $_;
    print "$_\n" foreach(@chars);
}

调用<>读取的魔术文件句柄*ARGV,并在调用readline时打开它.

但实际上,我是明确使用的粉丝,Encode::decodeEncode::encode在适当的时候.


我看着这个并想,"那不行!在第一行已经从`<>`"读出之后你就设置了`binmode`.但是,我尝试了它,它确实*工作.非常神奇.

3> Bruno De Fra..:

您可以使用以下-C标志默认打开UTF8 :

perl -CSD -ne 'print join("\n",split //);' utf8.txt

交换机-CSD无条件地打开UTF8; 如果你只是使用-C它,只有当相关的环境变量(LC_ALL,LC_TYPELANG)表明时才会打开UTF8 .有关详细信息,请参阅perlrun.

如果不直接调用perl,则不建议这样做(特别是,如果将选项从shebang行传递给perl,则可能无法正常工作).在这种情况下,请参阅其他答案.

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有