这是否正常?一些错误消息已经解码,一些需要解码才能获得正确的输出。
#!/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( $@ );
}
}
答案 0 :(得分:7)
我正确使用utf8 :: is_utf8吗?
没有。使用utf8::is_utf8
是不正确的,因为你永远不应该使用它!使用utf8::is_utf8
来猜测字符串的语义就是所谓的The Unicode Bug的实例。除了在调试Perl或XS模块时检查变量的内部状态时,utf8::is_utf8
没有用。
它不表示变量中的值是否使用UTF-8编码。事实上,这是不可能可靠的。例如,"\xC3\xA9"
是否会生成使用UTF-8编码的字符串?好吧,没有办法知道!这取决于我的意思是"é"
,"é"
还是完全不同的东西。
如果变量可能包含编码和解码的字符串,则由您决定使用第二个变量进行跟踪。不过,我强烈建议不要这样做。只需从外部解码所有内容。
如果你真的不能,最好还是尝试解码$@
并忽略错误。 very unlikely可读的非UTF-8是有效的UTF-8。
# $@ is sometimes encoded. If it's not,
# the following will leave it unchanged.
utf8::decode($@);
print $@;