找出标量值是ASCII / UTF8(文本)还是Perl中的二进制数据的最佳方法是什么?这段代码是对的吗?:
if (is_utf8($scalar, 1) or ($scalar =~ m/\A [[:ascii:]]* \Z/xms)) {
# $scalar is a text
}
else {
# $scalar is a binary
}
有更好的方法吗?
答案 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模块中弄乱实用程序函数是错误的方法。