0

次のソフトウェアがあります。

Ubuntu Linux 14.04 LTS

$ uname -a
Linux XXX 3.13.0-45-generic #74-Ubuntu SMP Tue Jan 13 19:36:28 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Perl 5.18:

$ perl -version

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi
(with 41 registered patches, see perl -V for more detail)

および Encode.pm 2.49:

$ head -n 10 /usr/lib/perl/5.18/Encode.pm
#
# $Id: Encode.pm,v 2.49 2013/03/05 03:13:47 dankogai Exp dankogai $

Encode.pm を使用したパッケージであるikiwikiを使用すると、次のエラーが発生しました。

$ ikiwiki --setup ~/wiki.setup
Cannot decode string with wide characters at /usr/lib/perl/5.18/Encode.pm line 176.

Encode.pm の 166 ~ 180 行目:

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

この問題を解決する方法を知っている親切な魂はいますか?

4

1 に答える 1

1

このエラーは、既にデコードされているものをデコードしようとすると発生します。

少し拡張すると、Perl ではバイト文字列と文字列を使用できます。入力時に、データをバイトから文字列に変換できます (たとえば、デコードまたは IO レイヤーを使用)。出力では、文字列をバイトに変換する必要があります (たとえば、エンコードまたは IO レイヤーを使用)。

あなたの場合、$octets変数にはすでにバイトから文字に変換された文字列が含まれているようです。アーリー リターンを追加することで、これを回避できます。

return $octets if Encode::is_utf8($octets);
于 2015-02-25T03:47:15.020 に答える