Perl将文件句柄就地/流从cp1252转换为utf-8?

标签 perl utf-8

我在一个包含 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, 0, SEEK_SET);

# now give $fh_utf8 to the library for transmission

这似乎是一堆额外的工作。有没有办法让它流式传输?我知道我可以使用 IO::Scalar 来消除写入磁盘的需要,但我仍然必须将整个内容读入内存。似乎有一种方法可以通过管道对其进行流式传输,但我现在还没有想办法做到这一点。

最佳答案

您可以为 PerlIO 编写自己的转换模块并与 :via(MODULE) 一起使用.您的模块可以通过 Text::Iconv 传递数据从一个字符集转换为另一个字符集。

这种方式在手册 PerlIO::via(3pm) 中有描述。 .简而言之,您需要创建自己的模块,例如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;

然后在 open 中使用它像这儿:
use strict;
use warnings;

use PerlIO::via::Example;

open(my $fh, "<:via(Example)", "input.txt");
while (<$fh>) {
    print;
}
close $fh;

关于Perl将文件句柄就地/流从cp1252转换为utf-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26184260/

相关文章:

python - python中字典列表的字典

python - 是否有与 perl 的 module-starter 等效的 python?

java - java 是否支持 if-then-else 正则表达式构造(Perl 构造)?

Php 电子邮件正文解码为纯文本

windows - 将 Subversion 提交消息转换为 Unicode

python - 如何抓取多个网站的缩略图截图?

linux - 如何使用 Perl 快速检查是否安装了 Linux `unzip`?

python - 我如何使用 Python 解码这个在随机网站上挑选并由 Django ORM 保存的 utf-8 字符串?

java - 不支持UTF-8字符

mysql - 如何解码mysql中错误编码的数据