如何猜测字符串在Perl中是否包含文本或二进制数据?

时间:2010-01-12 09:52:47

标签: perl

找出标量值是ASCII / UTF8(文本)还是Perl中的二进制数据的最佳方法是什么?这段代码是对的吗?:

if (is_utf8($scalar, 1) or ($scalar =~ m/\A [[:ascii:]]* \Z/xms)) {
     # $scalar is a text
}
else {
     # $scalar is a binary
}

有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

is_utf8测试是否打开了Perl utf8标志。标量可以包含正确形成的utf-8而不打开标志。我认为即使是畸形的utf-8也可以刻意打开旗帜,但我不确定。

要检查标量是否包含UTF-8数据,您需要检查标志,如果不是,请尝试类似

eval {
    my $utf8 = decode_utf8 ($scalar);
}

然后检查$@中的错误。

要检查非UTF-8标量是否包含非ASCII数据,您的想法$scalar =~ m/\A [[:ascii:]]* \Z/xms看起来不错。

答案 1 :(得分:2)

显然,最佳方式是在您阅读数据时简单地跟踪。您作为程序员应该已经知道您是在获取文本(及其编码)还是二进制数据。当您阅读文字时,您Encode::decode()(请参阅http://p3rl.org/UNI了解详细信息)到Perl文本字符串中。

如果您事先并不知道,-T and -B file tests会提供启发式功能。

无视Kinopiko的答案,在绝大多数情况下,您不需要了解数据的内部表示,而且从utf8 pragma模块中弄乱实用程序函数是错误的方法。