Как я могу обработать файл с несколькими кодировками в нем? - PullRequest
2 голосов
/ 15 декабря 2008

У меня есть небольшая программа для заказа и сортировки сообщений электронной почты с выводом в текстовый файл с использованием $msg->decoded->string. Программа perl выводит на stdout, и я перенаправляю ее в текстовый файл. Однако 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 или чем-то подобным. Если в файле есть символы, отличные от Юникода, это нарушит его?

Ответы [ 3 ]

3 голосов
/ 15 декабря 2008

Разные сообщения, вероятно, находятся в разных кодировках. Вероятно, gedit обнаруживает его как UTF-8, но позже узнает, что части файла не являются UTF-8. Подобные смешанные файлы являются основными PITA.

Лучшее (возможно, единственное) решение - проверить тип контента ($message->contentType) и преобразовать все в UTF-8.

1 голос
/ 15 декабря 2008

Вы можете использовать средство 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
1 голос
/ 15 декабря 2008

Если вы просто перенаправляете вывод Perl, то Perl будет сложно создать приличный файл.

Вы должны попробовать написать файл непосредственно из Perl.

Вам также следует проверить, действительно ли у вас есть проблема с кодировкой или символы, которые просто не принадлежат вашему файлу, все же остаются там. Для этого используйте vi, hex-редактор или просто hexdump.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...