2010-10-23 53 views
1

我有一个XML文件,我想分析:XML ::简单的编码问题

<?xml version="1.0" encoding="UTF-8" ?> 
<tag>û</tag> 

这完全是Firefox解析。但XML :: Simple会破坏一些数据。我有一个Perl的程序是这样的:

my $content = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"; 
$content .= "<tag>\x{c3}\x{bb}</tag>\n"; 

print "input:\n$content\n"; 

my $xml = new XML::Simple; 
my $data = $xml->XMLin($content, KeepRoot => 1); 

print "data:\n"; 
print Dumper $data; 

,并得到:

input: 
<?xml version="1.0" encoding="UTF-8" ?> 
<tag>û</tag> 

data: 
$VAR1 = { 
      'tag' => "\x{fb}" 
     }; 

它似乎没有什么我的预期。我认为有一些编码问题。难道我做错了什么?

UPD: 我以为XMLin在utf-8中返回文本(作为输入)。只需添加

encode_utf8($data->{'tag'}); 

和它的工作

回答

0

十六进制FB(DEC 251)是 “U” 字的ASCII码。您能否详细说明您期望在数据结构中得到什么,从而导致您得出结论是“腐败”?

+0

我的脚本解析一些XML(包含这样的字符)并生成另一个XML。另一个xml似乎格式不正确,因为解析器在该字符上失败。 – pacefist 2010-10-23 13:59:01

+0

我以为xmlin在utf-8中返回了文本,并且用'encoding = utf-8'生成了我自己的xml文件。 – pacefist 2010-10-23 14:02:00

3

XML ::简单是变幻莫测。

它调用Encode :: decode('UTF-8',$ content),它将UTF-8放入本地。

这样做:

my $content_utf8 = "whatevér"; 
my $xml = XMLin($content_utf8); 
my $item_utf8 = Encode::encode('UTF-8',$xml->{'item'}); 

这类作品太多,但有风险的瓦特/双编码:

my $content_utf8 = "whatevér"; 
my $double_encoded_utf8 = Encode::encode('UTF-8',$content_utf8); 
my $xml = XMLin($double_encoded_utf8); 
my $item_utf8 = $xml->{'item'}; 
+0

OMG - 这是在做我的头!感谢提示(终于搞定了) – 2015-06-03 07:55:13