如何处理来自外部文件/外部命令的数据中的无效UTF-8序列,哪些数据用于生成HTML(在Perl Web应用程序中)?
目前我在每条数据上运行to_utf8()
;所述子程序检测数据是否无效UTF-8,并回退到'latin1'编码:
use utf8;
use Encoding;
binmode STDOUT, ':utf8';
sub to_utf8 {
my $str = shift;
return undef unless defined $str;
if (utf8::valid($str)) {
utf8::decode($str);
return $str;
} else {
return decode($fallback_encoding, $str, Encode::FB_DEFAULT);
}
}
如果此代码不正确,请更正我。
来自Perl Unicode Essentials的Tom Christiansen’s Materials for OSCON 2011中推荐设置的(片段)是
use utf8;
use open qw( :encoding(UTF-8) :std );
如何使用上面的内容获得类似于我的内容?我更喜欢自动处理Unicode,而不必记住使用to_utf8()标记来自外部命令和文件的所有输出字符串。
数据来自外部文件,或来自外部命令的输出,而 应该是UTF-8,但由于用户错误,有时它不是。
答案 0 :(得分:3)
您可以编写一个自定义IO层来执行“神奇”解码。
Usualy IO层(如:utf8
)是用XS编写的,但核心模块PerlIO :: via(参见http://search.cpan.org/perldoc?PerlIO::via)允许您使用perl代码。