2010-12-22 92 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字符。