4

我有这两个字符串:

%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

这是一个分别在 cp-1251 和 utf-8 中的俄语 url 编码短语。我想在我的 utf-8 终端中使用 perl 以俄语查看它们。不幸的是,perl 模块 Encode::Detect(在 url 解码之后)无法检测到第一个示例的 cp-1251。相反,它提出了这个:“x-euc-tw”。

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

4

2 回答 2

4

Encode::Detect,它使用 Mozilla 通用字符集检测器,通过让不同的字符集探测器查看数据来工作。然后探测者报告不同的置信水平,具有最高置信度的探测者获胜。此过程仅取决于输入;它不受语言环境或其他外部设置的影响。在这种情况下,无论出于何种原因,euc-tw 的探测器报告的置信度都高于 windows-1251 的探测器,除了更改数据或修改源代码之外,您无能为力。

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

于 2012-07-27T17:29:12.307 回答
4

UTF-8 和 cp1251 是仅有的两个选项吗?cp1251 文本也是有效的 UTF-8 的可能性非常小。(这将是胡言乱语。)所以你可以这样做

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

这将比编码猜测器准确得多。

于 2012-07-27T17:45:31.077 回答