2012-10-21 5 views
13

ich einen Perl-App ausgeführt wird, die /opt/local/lib/perl5/5.12.4/darwin-thread-multi-2level/Encode.pmPerl Encode.pm kann nicht String mit Breitzeichen dekodieren

verwendet und einen Fehler

Kann Zeichenkette nicht mit breiten Zeichen auf/opt/local/lib dekodieren/perl5/5.12.4/darwin-thread-Multi-2Level/Encode.pm Linie 174.

Linie 174 von Encode.pm liest

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; 
} 

Problemumgehung?

Antwort

7

Ich hatte ein ähnliches Problem. $enc->decode($octets, $check); erwartet Oktetts.

So setzen Encode::_utf8_off($octets) vor. Es hat es für mich funktioniert.

+1

Danke das hat gut funktioniert! – MinaHany

+0

Verwenden Sie niemals '_utf8_off'. Die Verwendung dieser Funktion ist von Natur aus fehlerhaft, da '_utf8_off ($ s)' eine Abkürzung für 'utf8 :: encode ($ s) ist, wenn is_utf8 ($ s);'. Entweder kodieren oder nicht, aber tun Sie es nicht basierend auf etwas Zufällig! – ikegami

2

Diese Fehlermeldung besagt, dass Sie eine Zeichenfolge übergeben haben, die bereits dekodiert wurde (und Zeichen über dem Codepunkt 255 enthält). Sie können es nicht erneut dekodieren.

10

encode nimmt eine Reihe von Unicode-Codepunkten und serialisiert sie in eine Bytefolge.

decode nimmt eine Zeichenfolge von Bytes und deserialisiert sie in Unicode-Codepunkten.

Diese Nachricht bedeutet, dass Sie eine Zeichenfolge mit einem oder mehreren Zeichen über 255 (Nicht-Byte) an decode übergeben haben, was offensichtlich ein falsches Argument ist.

>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. 

Sie fragen nach einer Problemumgehung, aber der Fehler gehört Ihnen. Vielleicht versuchen Sie versehentlich, etwas zu entschlüsseln, das Sie bereits entschlüsselt haben?

+2

Benutzereingaben sind selten gut formatiert und ich muss ständig mit schlecht kodierten Dateien umgehen. Es wäre schön, wenn 'decode' die ungültigen Zeichen überspringen könnte, aber auf meinem Rechner, selbst wenn' Encode :: FB_QUIET' als drittes Argument übergeben wurde, stirbt es immer noch. – rjh

+1

@rjh, Das hat nichts mit dem OP-Problem zu tun. Sein Problem hat nichts mit schlecht kodierten Dateien zu tun. – ikegami

+1

das ist unwahr. Ich habe diese Antwort gefunden, weil ich den gleichen Fehler bekomme, wenn ich versuche, eine schlecht codierte Eingabedatei zu dekodieren. Speziell GB18030 kodiert mit einer ISO-8859-1 zu UTF-8-Konvertierung, sondern auch gültige UTF-8-Sequenzen (!). – rjh

Verwandte Themen