Perl将文件句柄就地/流式传输从cp1252转换为utf-8?
发布时间:2020-12-15 23:36:31 所属栏目:大数据 来源:网络整理
导读:我在文件中打开了一个文件句柄,其中包含cp1252个字符.我想将这个打开的文件句柄提供给一个期望原始utf8字节的库,它将通过网络发送它们. 这种天真的方法是将文件写入具有正确编码的第二个文件,并将第二个文件句柄提供给库: use Fcntl qw/SEEK_SET/;open my $
我在文件中打开了一个文件句柄,其中包含cp1252个字符.我想将这个打开的文件句柄提供给一个期望原始utf8字节的库,它将通过网络发送它们.
这种天真的方法是将文件写入具有正确编码的第二个文件,并将第二个文件句柄提供给库: use Fcntl qw/SEEK_SET/; open my $fh_1252,"<:encoding(cp1252)","1252.txt" || die $!; open my $fh_utf8,"+>:encoding(utf8)","utf8.txt" || die $!; while (<$fh_1252>){ print $fh_utf8 $_ }; seek($fh_utf8,SEEK_SET); # now give $fh_utf8 to the library for transmission 这似乎是一堆额外的工作.有没有办法简单地流动它?我知道我可以使用IO :: Scalar来删除写入磁盘的需要,但我仍然需要将整个内容读入内存.似乎有一种方法可以使用管道来传输它,但我现在还没想办法做到这一点. 解决方法
您可以为PerlIO编写自己的转换模块,并将其用于:via(MODULE).您的模块可以通过Text :: Iconv传递数据,以便从一个字符集转换为另一个字符集.
这种方式在手册PerlIO :: via(下午3点)中有所描述.简而言之,您需要创建自己的模块,例如PerlIO :: via :: Example-也就是说,你创建PerlIO / via目录并将Example.pm放在那里,其中包含以下内容: package PerlIO::via::Example; use strict; use warnings; use Text::Iconv; my $converter = Text::Iconv->new("windows-1252","utf-8"); sub PUSHED { my ($class,$mode,$fh) = @_; # When writing we buffer the data my $buf = ''; return bless $buf,$class; } sub FILL { my ($obj,$fh) = @_; my $line = <$fh>; return (defined $line) ? 'converted: ' . $converter->convert($line) : undef; # 'converted: ' is added here for debugging purposes } sub WRITE { my ($obj,$buf,$fh) = @_; $$obj .= $buf; # we do nothing here return length($buf); } sub FLUSH { my ($obj,$fh) = @_; print $fh $$obj or return -1; $$obj = ''; return 0; } 1; 然后在这里像开放一样使用它: use strict; use warnings; use PerlIO::via::Example; open(my $fh,"<:via(Example)","input.txt"); while (<$fh>) { print; } close $fh; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |