【发布时间】:2019-04-08 08:33:14
【问题描述】:
我对 Encode::Guess 感到困惑。假设这是我的 perl 代码:
use strict;
use warnings;
use 5.18.2;
use Encode;
use Encode::Guess qw/utf8 iso-8859-1/;
use open IO => ':encoding(UTF-8)', ':std';
my $str1 = "1 = educa\x{c3}\x{a7}\x{c3}\x{a3}o";
my $str2 = "2 = educa\x{e7}\x{e3}o";
say "A: ".&fixEnc($str1);
say "B: ".&fixEnc($str1,'hint');
say "C: ".&fixEnc($str2);
say "D: ".&fixEnc($str2,'hint');
say "";
sub fixEnc() {
my $data = $_[0];
my $enc = "";
if ($_[1]) {
$enc = guess_encoding($data,qw/utf8 iso-8859-1/);
} else {
$enc = guess_encoding($data);
};
if (!ref($enc)) {
return "ERROR: Can't guess: $enc for $data";
} else {
my $utf8 = decode($enc->name, $data);
$utf8 = "encoding guess: ".$enc->name."; result: $utf8";
return $utf8;
};
};
它产生:
A1: ERROR: Can't guess: iso-8859-1 or utf8 for 1 = educação
B2: ERROR: Can't guess: utf8 or iso-8859-1 for 1 = educação
C1: encoding guess: iso-8859-1; result: 2 = educação
D1: encoding guess: iso-8859-1; result: 2 = educação
现在,如果我替换 'use Encode::Guess qw/utf8 iso-8859-1/;'通过'使用编码::猜测;'我明白了
A2: encoding guess: utf8; result: 1 = educação
B2: ERROR: Can't guess: iso-8859-1 or utf8 for 1 = educação
C2: ERROR: Can't guess: No appropriate encodings found! for 2 = educação
D2: encoding guess: iso-8859-1; result: 2 = educação
造成这种差异的原因是什么?特别是,为什么我用utf8提示时不会猜到utf8?
编辑:我在下面发布了一个答案。基本上,人们意识到 Guess 使用字符编码并且不会说葡萄牙语! 'educação',虽然不是葡萄牙语,但 Guess 无法区分上面字符串 1 的 正确 latin-1 版本(与说葡萄牙语的人不同)。
【问题讨论】:
-
总是
use strict; use warnings;! -
适当地修改了代码。虽然对我来说这没有任何区别?