我的重音字母有问题。
例如: 我有一个标签,其中包含:“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);
?>
答案 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中重置。