如何在Perl webapp中处理无效的UTF-8字符?

时间:2011-08-12 13:02:12

标签: perl web-applications unicode utf-8

如何处理来自外部文件/外部命令的数据中的无效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 EssentialsTom Christiansen’s Materials for OSCON 2011中推荐设置的(片段)是

use utf8;
use open qw( :encoding(UTF-8) :std );

如何使用上面的内容获得类似于我的内容?我更喜欢自动处理Unicode,而不必记住使用to_utf8()标记来自外部命令和文件的所有输出字符串。

数据来自外部文件,或来自外部命令的输出,而 应该是UTF-8,但由于用户错误,有时它不是。

1 个答案:

答案 0 :(得分:3)

您可以编写一个自定义IO层来执行“神奇”解码。

Usualy IO层(如:utf8)是用XS编写的,但核心模块PerlIO :: via(参见http://search.cpan.org/perldoc?PerlIO::via)允许您使用perl代码。