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

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;

(编辑:李大同)

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

    推荐文章
      热点阅读