1

アクセント付きの文字に問題があります。

例: 「il mio prodotto é molto bello」を含むタグがあります。ただし、出力は「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);

?>
4

1 に答える 1

2

これは、任意の言語のように見えるもので SAX 解析を処理する場合の通常のエラーです (Java および C に関する以前の回答を参照してください!)。

SAX イベントを解析している場合、Characters 関数は開始タグと終了タグの間の要素の内容全体ではなく、何度も呼び出すことができ、アクセント付き文字を扱っている場合はそうです。

完全な文字の内容は、開始タグと終了タグの間の値を連結することによってのみ決定できます。

したがって、「il mio prodotto é molto bello」という用語の場合、文字は「il mio prodotto 」、「é」、および「molto bello」でおそらく 3 回呼び出されるため、リテラルとして使用するのではなく、それらを連結する必要があります。 .

あなたの「キャラクター」機能は次のようになります。

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

あなたの文字が使用され、end_elementとstart_elementでリセットされます。

于 2012-06-20T10:05:33.057 に答える