Подтвердить что ты не робот

Perl Encode.pm не может декодировать строку с широким символом

Я запускал приложение perl, которое использует /opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pm

и выдает сообщение об ошибке

Невозможно декодировать строку с широкими символами в /opt/local/lib/perl 5/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;
}

Любое обходное решение?

4b9b3361

Ответ 1

У меня была аналогичная проблема. $enc->decode( $octets, $check ); ожидает октетов.

Итак, поставьте Encode::_utf8_off($octets) раньше. Это заставило его работать для меня.

Ответ 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.

Вы просите об обходном пути, но ошибка принадлежит вам. Возможно, вы случайно пытаетесь декодировать то, что вы уже расшифровали?

Ответ 3

В этом сообщении об ошибке говорится, что вы передали строку, которая уже была расшифрована (и содержит символы выше кода 255). Вы не можете декодировать его снова.