Perl Encode.pm无法解码宽字符字符串

Perl Encode.pm无法解码宽字符字符串,perl,unicode,utf-8,Perl,Unicode,Utf 8,我正在运行一个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 ) = @

我正在运行一个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;
}

任何解决方法?

该错误消息表示您传入了一个已解码的字符串(包含代码点255以上的字符)。无法再次解码。

编码
获取一个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.
你要求解决问题,但这个bug是你的。也许你无意中试图解码你已经解码的东西?

我也有类似的问题。
$enc->decode($octets,$check)需要八位字节


所以把编码::_utf8_off($octets)
放在前面。它让我工作起来。

用户输入的格式很少很好,我不得不一直处理编码不好的文件。如果
decode
可以跳过无效字符就好了,但是在我的机器上,即使将
Encode::FB_QUIET
作为第三个参数传递,它仍然会死掉。@rjh,这与OP的问题无关。他的问题与编码错误的文件无关。那是不正确的。我找到这个答案是因为我在解码一个编码错误的输入文件时遇到了同样的错误。具体而言,GB18030使用ISO-8859-1到UTF-8转换进行编码,但也包含有效的UTF-8序列(!)。@rjh,“宽字符”错误不能来自编码错误的文件。文件不可能包含这些宽字符。要么你得到的错误不同,你的问题也不同于OP,要么你错误的原因是错误的。如果您发布了一个适当的问题,并对您的问题进行了适当的演示,我将很乐意对此进行研究。谢谢,您是正确的,我能够通过适当的decode()和encode()调用来修复它。永远不要使用
\u utf8\u off
。使用此函数本身就是有缺陷的,因为
\u utf8\u off($s)
utf8::encode($s)的缩写,如果是\u utf8($s)。要么进行编码,要么不进行编码,但不要基于随机因素进行编码!