在Perl编码检测的正确方法(The proper way of encoding detectio

2019-09-20 07:56发布

我有这两个字符串:

%EC%E0%EC%E0+%EC%FB%EB%E0+%F0%E0%EC%F3
%D0%BC%D0%B0%D0%BC%D0%B0%20%D0%BC%D1%8B%D0%BB%D0%B0%20%D1%80%D0%B0%D0%BC%D1%83

这是俄罗斯一个URL编码的短语CP-1251和UTF-8分别。 我想用perl看到他们在俄罗斯我的UTF-8终端。 不幸的是,perl的模块编码::检测(后URL解码)不能检测到第一实施例的CP-1251。 相反,它提出了这一点: “X-EUC-TW”。

的问题是,什么是检测正确的编码在这种情况下(指定的区域设置的参数,使用其他模块...)的正确方法?

Answer 1:

是UTF-8和CP1251的只有两个选择? 有CP1251文本,它也是有效的UTF-8的可能性是极其微小的。 (这将是乱码)。所以,你可以做

use Encode qw( decode );
my $decoded = eval { decode('UTF-8', $encoded, Encode::FB_CROAK) }
    // decode('cp1251', $encoded);

这将是远远更为准确,一个编码猜测者。



Answer 2:

Encode::Detect ,使用Mozilla的通用字符集检测,工作原理是让不同的字符集探测头看看数据。 探测头然后报告不同的置信水平,并具有最高的信心胜探测器。 这个过程仅取决于输入; 它不是由语言环境或其他外部设置的影响。 在这种情况下,无论出于何种原因,EUC-TW探测器是报告比探测器的Windows-1251更高的信心,并没有什么可以做短改变数据或修改源代码。

你可以尝试使用Encode::Guess它允许指定编码可供选择的列表。



文章来源: The proper way of encoding detection in perl