18

使用するperlアプリを実行していました/opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pm

エラーを発行します

/opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pm 行 174 で、ワイド文字を含む文字列をデコードできません。

Encode.pm読み取りの 174 行目

sub decode($$;$) {
    my ( $name, $octets, $check ) = @_;
    return undef unless defined $octets;
    $octets .= '' if ref $octets;
    $check ||= 0;
    my $enc = find_encoding($name);
    unless ( defined $enc ) {
        require Carp;
        Carp::croak("Unknown encoding '$name'");
    }
    my $string = $enc->decode( $octets, $check );  # line 174
    $_[1] = $octets if $check and !ref $check and !( $check & LEAVE_SRC() );
    return $string;
}

回避策はありますか?

4

3 に答える 3

14

encodeUnicode コード ポイントの文字列を受け取り、それらをバイト文字列にシリアル化します。

decodeバイト文字列を受け取り、それらを Unicode コード ポイントに逆シリアル化します。

このメッセージは、255 を超える文字 (バイト以外) を 1 つ以上含む文字列を に渡したという意味decodeであり、これは明らかに正しくない引数です。

>perl -MEncode -E"for (254..257) { say; decode('iso-8859-1', chr($_)); }"
254
255
256
Wide character in subroutine entry at .../Encode.pm line 176.

あなたは回避策を求めますが、バグはあなたのものです。おそらく、すでにデコードしたものを誤ってデコードしようとしていますか?

于 2012-10-21T01:47:57.447 に答える
7

同様の問題がありました。 $enc->decode( $octets, $check ); オクテットを期待します。

だからEncode::_utf8_off($octets)前に置く。それは私のために働きました。

于 2013-03-16T10:47:14.573 に答える
2

そのエラーメッセージは、すでにデコードされている(そしてコードポイント255より上の文字を含む)文字列を渡したということです。再度デコードすることはできません。

于 2012-10-21T01:32:34.977 に答える