内容

名称

Encode::Guess -- 从数据猜测编码

概要

# if you are sure $data won't contain anything bogus

use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
my $utf8 = decode("Guess", $data);
my $data = encode("Guess", $utf8);   # this doesn't work!

# more elaborate way
use Encode::Guess;
my $enc = guess_encoding($data, qw/euc-jp shiftjis 7bit-jis/);
ref($enc) or die "Can't guess: $enc"; # trap error this way
$utf8 = $enc->decode($data);
# or
$utf8 = decode($enc->name, $data)

摘要

Encode::Guess 使您能够猜测给定数据所编码的编码,或者至少尝试猜测。

说明

默认情况下,它仅检查带有 BOM 的 ascii、utf8 和 UTF-16/32。

use Encode::Guess; # ascii/utf8/BOMed UTF

为了更实际地使用它,您必须给出要检查的编码名称(如下所示的嫌疑)。嫌疑的名称可以是规范名称或别名。

注意:与 UTF-(16|32) 不同,utf8 中的 BOM 不会自动删除。

# tries all major Japanese Encodings as well
 use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;

如果将 $Encode::Guess::NoUTFAutoGuess 变量设置为 true 值,则不会将启发式方法应用于 UTF8/16/32,并且结果将仅限于嫌疑和 ascii

Encode::Guess->set_suspects

您还可以通过 set_suspects 方法更改内部嫌疑列表。

use Encode::Guess;
Encode::Guess->set_suspects(qw/euc-jp shiftjis 7bit-jis/);
Encode::Guess->add_suspects

或者,您可以使用 add_suspects 方法。不同之处在于 set_suspects 会刷新当前嫌疑列表,而 add_suspects 会添加嫌疑。

use Encode::Guess;
Encode::Guess->add_suspects(qw/euc-jp shiftjis 7bit-jis/);
# now the suspects are euc-jp,shiftjis,7bit-jis, AND
# euc-kr,euc-cn, and big5-eten
Encode::Guess->add_suspects(qw/euc-kr euc-cn big5-eten/);
Encode::decode("Guess" ...)

当您对嫌疑人列表感到满意时,您现在可以

my $utf8 = Encode::decode("Guess", $data);
Encode::Guess->guess($data)

但如果

  • 有两个或更多嫌疑人

  • 没有嫌疑人

那么您应该尝试这样做;

my $decoder = Encode::Guess->guess($data);

成功时,$decoder 是在 Encode::Encoding 中记录的对象。因此,您现在可以执行以下操作;

my $utf8 = $decoder->decode($data);

失败时,$decoder 现在包含错误消息,因此整个内容如下;

my $decoder = Encode::Guess->guess($data);
die $decoder unless ref($decoder);
my $utf8 = $decoder->decode($data);
guess_encoding($data, [, 嫌疑人列表])

您还可以尝试默认导出的 guess_encoding 函数。它获取要检查的 $data,还可以选择获取嫌疑人列表。可选的嫌疑人列表不会反映到内部嫌疑人列表中。

my $decoder = guess_encoding($data, qw/euc-jp euc-kr euc-cn/);
die $decoder unless ref($decoder);
my $utf8 = $decoder->decode($data);
# check only ascii, utf8 and UTF-(16|32) with BOM
my $decoder = guess_encoding($data);

注意事项

毕竟,这只是一个猜测。在涉及编码时,您应该始终明确。但是,有一些环境(尤其是日语环境)必须进行猜测编码。请谨慎使用此模块。

待办事项

Encode::Guess 在 EBCDIC 平台上不起作用。

另请参阅

EncodeEncode::Encoding