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

Men*_* Lu 15 unicode perl 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行解码带宽字符的字符串.

第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;
}
Run Code Online (Sandbox Code Playgroud)

任何解决方法?

ike*_*ami 13

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.
Run Code Online (Sandbox Code Playgroud)

你要求一个解决方法,但错误是你的.也许你不小心试图解码已解码的东西?

  • 用户输入很少格式化,我必须始终处理编码错误的文件.如果`decode`可以跳过无效的字符会很好,但是在我的机器上,即使将`Encode :: FB_QUIET`作为第三个参数传递,它仍然会死掉. (2认同)

Aft*_*ock 7

我遇到了类似的问题. $enc->decode( $octets, $check ); 期待八位字节.

所以放在Encode::_utf8_off($octets)前面.它使它对我有用.

  • 切勿使用`_utf8_off`。使用此功能本质上是有问题的,因为如果is_utf8($ s);,则_utf8_off($ s)是utf8 :: encode($ s)的缩写。要么编码,要么不编码,但不要基于随机性! (2认同)