Ответ 1
У меня была аналогичная проблема.
$enc->decode( $octets, $check );
ожидает октетов.
Итак, поставьте Encode::_utf8_off($octets)
раньше. Это заставило его работать для меня.
Я запускал приложение 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;
}
Любое обходное решение?
У меня была аналогичная проблема.
$enc->decode( $octets, $check );
ожидает октетов.
Итак, поставьте Encode::_utf8_off($octets)
раньше. Это заставило его работать для меня.
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.
Вы просите об обходном пути, но ошибка принадлежит вам. Возможно, вы случайно пытаетесь декодировать то, что вы уже расшифровали?
В этом сообщении об ошибке говорится, что вы передали строку, которая уже была расшифрована (и содержит символы выше кода 255). Вы не можете декодировать его снова.