【问题标题】:The proper way of encoding detection in perlperl中编码检测的正确方法
【发布时间】:2012-07-27 16:04:41
【问题描述】:

我有这两个字符串:

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

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

【问题讨论】:

    标签: perl utf-8 encode cp1251


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 有一些引人入胜的论文概述了 Mozilla 是如何得出这个解决方案的。这是一个棘手的问题。
      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 2012-08-23
      • 2011-01-02
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      相关资源
      最近更新 更多