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文字列のセマンティクスを推測するために使用するのは、Unicodeバグのインスタンスとして知られているものです。PerlまたはXSモジュールをデバッグするときに変数の内部状態を検査することを除いて、役に立たutf8::is_utf8ない。

変数の値がUTF-8を使用してエンコードされているかどうかは示されません。実際、それを確実に知ることは不可能です。たとえば、"\xC3\xA9"UTF-8を使用してエンコードされた文字列を生成しますか?まあ、知る方法はありません!それは私が意味したのか"é""é"それともまったく違うものなのかによって異なります。

変数にエンコードされた文字列とデコードされた文字列の両方が含まれている可能性がある場合は、2番目の変数を使用してそれを追跡する必要があります。ただし、これには強くお勧めします。外部から入ってくるものをすべてデコードするだけです。

本当にできない場合は、$@エラーをデコードして無視することをお勧めします。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 に答える