【问题标题】:Perl Encode.pm cannot decode string with wide characterPerl Encode.pm 无法解码带有宽字符的字符串
【发布时间】:2012-10-11 05:45:18
【问题描述】:

我正在运行一个使用 /opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pm 的 perl 应用程序

并发出错误

无法在 /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;
}

有什么解决方法吗?

【问题讨论】:

    标签: perl unicode utf-8


    【解决方案1】:

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

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

    【讨论】:

    • 永远不要使用_utf8_off。使用这个函数本质上是错误的,因为_utf8_off($s)utf8::encode($s) if is_utf8($s); 的缩写。编码或不编码,但不要基于随机的东西!
    【解决方案2】:

    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.
    

    您要求解决方法,但错误是您的。也许你不小心尝试解码你已经解码的东西?

    【讨论】:

    • 用户输入的格式很少,我不得不一直处理编码错误的文件。如果decode 可以跳过无效字符就好了,但是在我的机器上,即使Encode::FB_QUIET 作为第三个参数传递,它仍然会死掉。
    • @rjh,这与 OP 的问题无关。他的问题与编码错误的文件无关。
    • 这是不真实的。我找到了这个答案,因为我在尝试解码编码错误的输入文件时遇到了同样的错误。特别是使用 ISO-8859-1 到 UTF-8 转换的 GB18030 编码,但也包含有效的 UTF-8 序列 (!)。
    • @rjh,“宽字符”错误不能来自编码错误的文件。文件不可能包含这些宽字符。您得到的错误不同并且您的问题与 OP 的不同,或者您对错误的原因有误。如果您发布正确的问题并正确演示您的问题,我将很乐意进行调查。
    • 谢谢,你是对的,我能够通过适当的 decode() 和 encode() 调用来修复它。
    【解决方案3】:

    该错误消息表明您传入了一个已经解码的字符串(并且包含高于代码点 255 的字符)。无法再次解码。

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多