2015-02-25 3 views
0

У меня есть следующее программное обеспечение:ошибка Perl, связанные с Encode.pm

Ubuntu Linux 14.04 LTS

$ uname -a 
Linux XXX 3.13.0-45-generiC#74-Ubuntu SMP Tue Jan 13 19:36:28 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux 

Perl 5,18:

$ perl -version 

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi 
(with 41 registered patches, see perl -V for more detail) 

и Encode.pm 2,49:

$ head -n 10 /usr/lib/perl/5.18/Encode.pm 
# 
# $Id: Encode.pm,v 2.49 2013/03/05 03:13:47 dankogai Exp dankogai $ 

Когда я пользуюсь ikiwiki, который является пакет с помощью Encode.pm, я получил следующее сообщение об ошибке:

$ ikiwiki --setup ~/wiki.setup 
Cannot decode string with wide characters at /usr/lib/perl/5.18/Encode.pm line 176. 

Строки 166 - 180 из Encode.pm гласит:

sub decode($$;$) { 
    my ($name, $octets, $check) = @_; 
    return undef unless defined $octets; 
    $octets .= ''; 
    $check ||= 0; 
    my $enc = find_encoding($name); 
    unless (defined $enc) { 
     require Carp; 
     Carp::croak("Unknown encoding '$name'"); 
    } 
    my $string = $enc->decode($octets, $check); 
    $_[1] = $octets if $check and !ref $check and !($check & LEAVE_SRC()); 
    return $string; 
} 

ли какой-нибудь добрая душа есть идея, как исправить Эта проблема?

ответ

1

Эта ошибка возникает, когда вы пытаетесь декодировать что-то, что уже декодировано.

Чтобы немного расширить, в Perl вы можете иметь строки байтов и символьные строки. При вводе ваши данные могут быть преобразованы из байтов в строку символов (например, с использованием декодирования или слоя ввода-вывода). При выводе символьная строка должна быть преобразована в байты (например, с использованием кодирования или слоя ввода-вывода).

Похоже, что в вашем случае переменная $octets содержит строку, которая уже была преобразована из байтов в символы. Вы можете решить эту проблему путем добавления раннего возврата:

return $octets if Encode::is_utf8($octets); 
Смежные вопросы