考虑以下问题:

多行字符串$junk包含一些以UTF-8编码的行和一些以ISO-8859-1编码的行。我不知道哪些行是哪种编码的先验知识,因此将需要启发式。

我想通过正确重新编码ISO-8859-1行将$junk转换为纯UTF-8。另外,如果处理中出现错误,我想提供“尽力而为的结果”,而不是抛出错误。

我当前的尝试如下所示:

$junk = force_utf8($junk);

sub force_utf8 {
  my $input = shift;
  my $output = '';
  foreach my $line (split(/\n/, $input)) {
    if (utf8::valid($line)) {
      utf8::decode($line);
    }
    $output .= "$line\n";
  }
  return $output;
}

显然,由于我们缺少有关每行原始编码的信息,因此转换永远不会是完美的。但这是我们可以获得的“尽力而为的结果”吗?

您将如何改善force_utf8(...)子项的启发式/功能性?

最佳答案

除了我会先尝试使用Encode::Guess之外,我没有其他有用的建议。

08-16 11:45