2015-01-03 4 views
1

В perl я читаю html-страницы и делаю преобразование в utf8 по тексту :: iconv. Но когда какая-то страница определила неправильный набор кодов, например: charset = «blabla», тогда программа perl умерла отпечатка «неподдерживаемое преобразование». Я попытался установить Text :: Iconv-> raise_error в 0 или 1, но без успеха программа всегда умерла.perl text :: iconv неподдерживаемое преобразование

Как избежать аварии программы? ИЛИ как проверить поддерживаемый код перед преобразованием? (Я знаю, что прочитал его в ОС «iconv --list», но должен существовать лучшее решение (надеюсь))

ответ

1

Как избежать краха программы?

Perl использует eval для улавливания ошибок:

use strict; 
use warnings; 
use 5.016; 
use Text::Iconv; 

my $source_encoding = 'blabla'; 
my $result_encoding = 'utf-8'; 

my $converter = eval { 
    Text::Iconv->new(
     $source_encoding, 
     $result_encoding 
    ); 
}; #Error message gets inserted into [email protected] 

if (not $converter and [email protected] =~ /invalid argument/i) { 
    say "Either the '$source_encoding' encoding or the ", 
    "'$result_encoding' encoding\nis not available on this system."; 
} 

if ($converter) { #Can new() fail in other ways? 
    my $result = $converter->convert('€'); 

    if (not $result) { 
     say "Some characters in '$source_encoding'\n", 
      "are invalid in '$result_encoding'."; 
    } 
    else { 
     say $result; 
    } 
} 

В [блоке] форме, код внутри блока обрабатывается только один раз - в то же время код, окружающий Eval сами по себе была проанализирована - и выполняется в контексте текущей программы Perl. Эта форма обычно используется для ловушки исключений более эффективно, чем первая (см. Ниже), а также обеспечивает возможность проверки кода в блоке во время компиляции.

http://perldoc.perl.org/functions/eval.html

ИЛИ как проверить, поддерживается кодовым до преобразования? (Я знаю, что читать его в ОС с помощью «Iconv --list», но должно существовать лучшее решение (надежду))

Что так плохо о iconv --list?

use strict; 
use warnings; 
use 5.016; 
use Text::Iconv; 

my $source_encoding = 'blabla'; 
my $result_encoding = 'utf-8'; 

my $available_encodings = `iconv --list`; #Backticks return a string. 
my @encodings_arr = split /\s+/, $available_encodings; 
my %encodings_set = map {lc $_ => undef} @encodings_arr; 

my $source_encoding_available = exists $encodings_set{$source_encoding}; 
my $result_encoding_available = exists $encodings_set{$result_encoding}; 

if($source_encoding_available 
    and $result_encoding_available) { 

    say "Ready to convert"; 
} 
else { 
    if (not $source_encoding_available) { 
     say "'$source_encoding' encoding not available."; 
    } 
    if (not $result_encoding_available) { 
     say "'$result_encoding' encoding not available."; 
    } 
} 
Смежные вопросы