如何处理包含多个编码的文件?

时间:2008-12-15 14:39:27

标签: perl encoding

我有一个小程序来订购和排序电子邮件,使用$msg->decoded->string输出到文本文件。 perl程序输出到stdout,我将其重定向到txt文件。但是,由于字符集问题,gedit无法打开此文本文件,我想知道如何使用perl恢复或设置字符集。

现在该程序:

#!/usr/bin/perl
use warnings;
use strict;
use Mail::Box::Manager;

open (MYFILE, '>>data.txt');

my $file = shift || $ENV{MAIL};
my $mgr = Mail::Box::Manager->new(
    access          => 'r',
);

my $folder = $mgr->open( folder => $file )
or die "$file: Unable to open: $!\n";

for my $msg ( sort { $a->timestamp <=> $b->timestamp } $folder->messages)
{
    my $to          = join( ', ', map { $_->format } $msg->to );
    my $from        = join( ', ', map { $_->format } $msg->from );
    my $date        = localtime( $msg->timestamp );
    my $subject     = $msg->subject;
    my $body        = $msg->decoded->string;

    # Strip all quoted text
    $body =~ s/^>.*$//msg;

    print MYFILE <<"";
From: $from
To: $to
Date: $date
$body

}

但是我遇到了同样的问题,即我无法用gedit打开文件,即使它适用于vi等。如果文件中有非unicode字符,是否会破坏它?

3 个答案:

答案 0 :(得分:3)

不同的消息可能采用不同的编码方式。可能gedit会将其检测为UTF-8,但后来发现文件的某些部分不是UTF-8。像这样的混合文件是主要的PITA。

最好(也许唯一)解决方案是检查内容类型($message->contentType)并将所有内容转换为UTF-8。

答案 1 :(得分:1)

如果您只是重定向Perl的输出,那么Perl将很难生成一个体面的文件。

您应该尝试直接从Perl编写文件。

您还应该检查您是否确实存在编码问题,或者您文件中不属于的字符是否仍然存在。使用vi或十六进制编辑器或简单地使用hexdump来做到这一点。

答案 2 :(得分:1)

您可以使用IO图层工具。打开这样的文件以指定编码:

open my $fh, '>:encoding(UTF-8)', $file;

或者你可以使用binmode()来改变已打开的文件句柄:

binmode(STDOUT, ':encoding(UTF-8)');

当然,您可以设置除utf8之外的其他编码,还有很多其他选项。只需查看open和binmode的文档即可。也许IO :: File值得一看:

perldoc -f open
perldoc -f binmode
perldoc IO::File