3

这是否正常工作?一些错误消息已经被解码,而一些需要解码的错误消息确实得到了正确的输出。

#!/usr/bin/env perl
use warnings;
use strict;
use utf8;
use open qw(:utf8 :std);
use Encode qw(decode_utf8);

# ...

if ( not eval{
    # some error-messages (utf8) are decoded some are not
    1 }
) {
    if ( utf8::is_utf8 $@ ) {
        print $@;
    }
    else {
        print decode_utf8( $@ );
    }
}
4

1 回答 1

9

我正确使用 utf8::is_utf8 吗?

不,任何使用utf8::is_utf8都是不正确的,因为你不应该使用它!用来utf8::is_utf8猜测字符串的语义是所谓的The Unicode Bug的一个实例。除了在调试 Perl 或 XS 模块时检查变量的内部状态外,utf8::is_utf8没有任何用处。

它不指示变量中的值是否使用 UTF-8 编码。事实上,这是不可能可靠地知道的。例如,是否"\xC3\xA9"生成使用 UTF-8 编码的字符串?好吧,没有办法知道!这取决于我的意思是"é""é"还是完全不同的东西。

如果变量可能同时包含编码字符串和解码字符串,则由您决定使用第二个变量来跟踪它。不过,我强烈建议不要这样做。只需解码从外部传入的所有内容。

如果你真的不能,你最好尝试解码$@并忽略错误。不是 UTF-8的可读内容不太可能是有效的 UTF-8。

# $@ is sometimes encoded. If it's not,
# the following will leave it unchanged.
utf8::decode($@);

print $@;
于 2013-01-29T13:28:03.903 回答