解析器sax在php中带有重音字母

时间:2012-06-20 09:56:34

标签: php xml parsing

我的重音字母有问题。

例如: 我有一个标签,其中包含:“il mioprodottoémoltobello”。但是,输出是:“il mio prodotto”

当在xml中,并且有一个带重音的字母时,日期被剪切。我有一个xml:

<?xml version="1.0" encoding="utf-8"?>

这是我的解析器代码:

<?php
class Content_Handler {
   function Content_Handler(){}
   function start_element($parser, $name, $attrs) {
       global $desc, $names, $link;
       if ($name == "PRODUCT"){
          $zupid = ($attrs["ZUPID"]);
          echo "$zupid<br>";
       }
       if ($name == "DESCRIPTION") { $desc = true;}
       if ($name == "NAME") { $names = true;}
       if ($name == "DEEPLINK") { $link = true;}
   }

   function end_element($parser, $name) {
       if ($name == "PRODUCT") {
          print "<br />";
       }
   }


   function characters($parser, $chars) {
       global $desc, $names, $link;
       if ($desc) { echo $chars."<br>"; $desc = false;} 
       if ($names) { echo $chars."<br>"; $names = false;} 
       if ($link) { echo $chars."<br>"; $link = false;} 
   }
}


$handler = new Content_Handler();
$cat_parser = xml_parser_create("UTF-8");

xml_parser_set_option($cat_parser, XML_OPTION_TARGET_ENCODING, "ISO-8859-1");
xml_set_object($cat_parser, $handler);
xml_set_element_handler($cat_parser, "start_element", "end_element");
xml_set_character_data_handler($cat_parser, "characters");


$file = "my.xml";


if ($file_stream = fopen($file, "r")) {

   while ($data = fread($file_stream, 4096)) {

       $this_chunk_parsed = xml_parse($cat_parser, $data, feof($file_stream));
       if (!$this_chunk_parsed) {
           $error_code = xml_get_error_code($cat_parser);
           $error_text = xml_error_string($error_code);
           $error_line = xml_get_current_line_number($cat_parser);

           $output_text = "Parsing problem at line $error_line: $error_text";
           die($output_text);
       }
   }
} else {

    die("Can't open XML file.");

}
xml_parser_free($cat_parser);

?>

1 个答案:

答案 0 :(得分:1)

在处理看似任何语言的SAX解析时,这是正常错误(请参阅有关java和C的先前答案!)。

当你解析SAX事件时,Characters函数不是start和end标签之间元素的全部内容,它可以多次调用,当你处理重音字符时,它就是。

完整的字符内容只能通过合并起始标记和结束标记之间的值来确定。

因此,对于你的术语“il mioprodottoémoltobello”,人物将被称为“il mio prodotto”,“é”和“molto bello”3次,所以你需要将它们连接起来,而不是使用他们是litterals。

你的'人物'功能应该更像:

function characters($parser, $chars) {
   global $desc, $names, $link;
   $fullchars .= $chars;
}

使用你的字符并在end_element和start_element中重置。