2010-12-22 64 views
0

我在我們的代碼中兩個完全無關的地方收到類似的錯誤,我們似乎無法弄清楚如何解決。Perl正則表達式錯誤幫助

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

而第二個是當我們試圖做簡單的字符串替換:當我們試圖用XML::Simple解析XML第一個錯誤發生

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. 

我們Log.pm文件有問題的行如下所示,其中$message是一個字符串:

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

我們在排查最大的問題,這是我們還沒有找到一種方法來識別輸入是CA使用此發生。我希望以前有人遇到過這個問題,可以提供建議或示例代碼,以幫助我們解決問題。

在此先感謝您的幫助!

+0

我有很多建議來捕捉輸入,我很欣賞,但任何一個實際上可以幫助解決問題? – 2010-12-23 09:13:00

+0

我們正在猜測您的XML已損壞。當你發現它被破壞的方式時,就會明白如何解決它,因此錯誤不會再發生。 – daxim 2010-12-23 12:11:19

回答

3

不知道是什麼原因,但如果要記錄導致此消息,你可以隨時添加一個__DIE__信號處理程序,以確保您捕獲錯誤:

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

應該在至少讓你知道什麼字符串正在觸發這些錯誤。

+3

或更好的,使用[`Carp :: Always`](http://search.cpan.org/perldoc?Carp::Always) – mob 2010-12-23 00:04:00

1

您可以對源數據執行十六進制轉儲以查看它的外觀嗎?

如果您從文件中讀取該文件,可以使用「od」這樣的工具來完成此操作。

或者,您也可以通過字符串傳遞給這樣的功能做到這一點的Perl腳本內部:

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

聽起來像是你有一個預計將有一個「XML」文件UTF-8編碼字符,但沒有。試着打開它並尋找hibit字符。