Как я могу обработать файл с несколькими кодировками в нем?

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

15.12.2008 14:39:26
3 ОТВЕТА
РЕШЕНИЕ

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

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

3
15.12.2008 15:42:08
Как бы вы конвертировали в utf-8, только если бы это был не utf-8?
user1253538 15.12.2008 16:27:03
Вы должны просто использовать Encode :: decode () для декодирования любой кодировки, которую использует сообщение, а затем вывести ее в дескриптор файла, который открывается как UTF-8.
Leon Timmermans 15.12.2008 17:01:33

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

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

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

1
15.12.2008 15:36:38
если бы не были символы Unicode, почему это сломало бы файл?
user1253538 15.12.2008 15:09:10
я думаю, что они имеют в виду стандартные символы ASCII .. но я считаю, что код ASCII являются допустимыми кодами Unicode в UTF-8 в любом случае, не так ли?
ShoeLace 15.12.2008 15:19:04
Оболочка не должна мешать. Это не изменяет текст, который выводится.
Leon Timmermans 15.12.2008 15:25:48

Вы можете использовать средство 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.12.2008 15:27:17
понятия не имею, какую кодировку попробовать. Когда я явно устанавливаю режим в UTF-8, он все равно не открывается, что не должно происходить на основании того, что я прочитал, поскольку кодирование проверяет данные.
user1253538 15.12.2008 15:32:19
Если вы передадите дерьмо, вы, скорее всего, получите это дерьмо. Вы пытались открыть файл чем-то не таким обидным, как gedit, чтобы увидеть, где может быть проблема?
innaM 15.12.2008 15:38:17
Это файл из примерно 200 писем, с которыми трудно разобраться. В одном из писем было несколько японских символов, но их удаление ничего не решило.
user1253538 15.12.2008 15:48:14
Mail :: Box :: Manager не предоставляет информацию о кодировке конкретных сообщений?
Dave Vogt 15.12.2008 16:26:02
Дейв: Да, посмотри на мой ответ.
Leon Timmermans 15.12.2008 16:58:13