【发布时间】:2011-02-03 01:18:07
【问题描述】:
考虑以下问题:
多行字符串$junk 包含一些以 UTF-8 编码的行和一些以 ISO-8859-1 编码的行。我不知道先验哪些行在哪个编码中,所以需要启发式。
我想将 $junk 转换为纯 UTF-8,并对 ISO-8859-1 行进行适当的重新编码。此外,如果处理过程中出现错误,我想提供“尽力而为的结果”,而不是抛出错误。
我目前的尝试是这样的:
$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(...) sub 的启发式/功能?
【问题讨论】:
-
您不断要求人们对您的代码发表评论,但您没有听他们在说什么。如果你的整个策略是错误的,那么对代码的注释是没有用的。
-
mpeters:我知道这种方法的局限性,因此需要启发式方法——这些东西是可以理解的。我的问题更像是“我知道这不是最佳的,但鉴于这些假设,这是我们能做的最好的吗”?到目前为止,这个问题仍然悬而未决。
-
这里是对代码的一个注释:不要使用
&调用子程序。force_utf8($junk)就够了。
标签: perl unicode utf-8 character-encoding text-processing