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 行解码带有宽字符的字符串。

第 174 行Encode.pm读取

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

encode接受一串 Unicode 代码点并将它们序列化为一串字节。

decode获取一串字节并将它们反序列化为 Unicode 代码点。

该消息意味着您将包含一个或多个大于 255(非字节)的字符的字符串传递给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 回答