2010-12-22 5 views
0

Ich erhalte einen ähnlichen Fehler an zwei völlig unzusammenhängenden Stellen in unserem Code, von dem wir nicht wissen, wie wir ihn lösen sollen. Der erste Fehler tritt auf, wenn wir versuchen, XML zu analysieren XML::Simple mit:Perl Regex Fehlerhilfe

Malformed UTF-8 character (unexpected end of string) in substitution (s///) at /usr/local/lib/perl5/XML/LibXML/Error.pm line 217. 

Und das zweite ist, wenn wir versuchen, einfache String-Ersetzung zu tun:

Malformed UTF-8 character (unexpected non-continuation byte 0x78, immediately after start byte 0xe9) in substitution (s///) at /gold/content/var/www/alltrails.com/cgi-bin/API/Log.pm line 365. 

Die Linie in Frage in unserer Log.pm Datei wie folgt ist, wo $message eine Zeichenfolge ist:

$message =~ s/\s+$//g; 

Unser größtes Problem in troubleshoot ist das, dass wir nicht einen Weg zu identifizieren, die Eingabe gefunden haben, die ca ist damit dies geschieht. Ich hoffe, dass jemand anderes schon einmal auf dieses Problem gestoßen ist und Ratschläge oder Beispielcode zur Verfügung stellen kann, die uns bei der Lösung helfen.

Vielen Dank im Voraus für Ihre Hilfe!

+0

Ich hatte viele Vorschläge, um den Input zu erfassen, die ich zu schätzen weiß, aber kann jemand tatsächlich bei der Lösung des Problems helfen? –

+0

Wir vermuten, dass Ihr XML nicht mehr funktioniert. Wenn Sie herausfinden, auf welche Weise es kaputt ist, wird klar, wie es zu beheben ist, und folglich tritt der Fehler nicht mehr auf. – daxim

Antwort

3

nicht sicher, was die Ursache ist, aber wenn Sie die Nachricht protokolliert werden soll, dass dies verursacht, können Sie immer ein __DIE__ Signal-Handler hinzufügen, um sicherzustellen, dass Sie den Fehler erfassen:

$SIG{__DIE__} = sub { 
    if ($_[0] =~ /Malformed UTF-8 character/) { 
    print STDERR "message = $message\n"; 
    } 
}; 

Das sollte bei Lass dich zumindest wissen, welcher String diese Fehler auslöst.

+3

Oder besser, verwenden Sie ['Carp :: Always '] (http://search.cpan.org/perldoc?Carp::Always) – mob

1

Können Sie einen Hex-Dump der Quelldaten machen, um zu sehen, wie es aussieht?

Wenn Sie dies aus einer Datei lesen, können Sie dies mit einem Tool wie "od" tun.

Oder Sie dies innerhalb des Perl-Skript tun können, selbst durch den String in eine Funktion wie folgt übergeben:

sub DumpString { 
    my @a = unpack('C*',$_[0]); 
    my $o = 0; 
    while (@a) { 
     my @b = splice @a,0,16; 
     my @d = map sprintf("%03d",$_), @b; 
     my @x = map sprintf("%02x",$_), @b; 
     my $c = substr($_[0],$o,16); 
     $c =~ s/[[:^print:]]/ /g; 
     printf "%6d %s\n",$o,join(' ',@d); 
     print " "x8,join(' ',@x),"\n"; 
     print " "x9,join(' ',split(//,$c)),"\n"; 
     $o += 16; 
    } 
} 
0

Klingt wie Sie eine „XML“ Datei, die erwartet wird UTF-8 haben codierten Zeichen aber nicht. Versuchen Sie es nur zu öffnen und nach hibit Charakteren zu suchen.

+0

Wenn dies der Fall ist, gibt es eine Möglichkeit, die Art, wie wir die Daten übergeben, zu aktualisieren XML :: Simple das Handle verschiedene Kodierungsmethoden. Für das andere Problem, gibt es eine Möglichkeit, die aktuelle Zeichenfolge automatisch in UTF-8-Format zu konvertieren, so ist dies kein Problem vorwärts? –

+0

@ Russell C .: zuerst herauszufinden, was das Problem ist und ob es in der Datei oder in der Handhabung der Datei ist, bevor es zu XML :: Simple – ysth