perl text :: iconv不支持的转换

时间:2015-01-03 09:26:57

标签: perl iconv

在perl中我读了html页面,我通过text :: iconv转换为utf8。但是当某些页面定义了错误的代码集时,例如:charset =“blabla”,那么perl程序就会打印出“不支持的转换”。 我试图将Text :: Iconv-> raise_error设置为0或1,但没有成功,程序总是死亡。

如何避免程序崩溃? 或者如何在转换前检查支持的代码集? (我知道在操作系统中通过“iconv --list”读取它,但必须存在更好的解决方案(希望))

1 个答案:

答案 0 :(得分: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 $@

if (not $converter and $@ =~ /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;
    }
}

在[block]形式中,BLOCK中的代码只被解析一次 - 同时解析eval本身周围的代码 - 并在当前Perl程序的上下文中执行。此表单通常用于比第一个表单更有效地捕获异常(见下文),同时还提供了在编译时检查BLOCK中的代码的好处。

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.";
    }
}