我有一个我组装的小 php/mysql 应用程序,它采用输入形式并将其存储在 MySQL 数据库中,并将数据输出为 XML 以供 radio 播放硬件设备使用。
问题是 & 符号和其他字符。用户正在获取各种广播电台的描述以及流媒体 URL 或播放列表 URL,并将它们粘贴到表单中。一些广播电台位于非英语国家(主要是法语)。我需要知道如何预处理这些字段,以便生成的 XML 不会损坏,这会破坏外部硬件应用程序。
我假设这应该进入提交表单时调用的 php。我很确定应该使用 htmlspecialchars 函数,但我不确定最好的方法,因为我已经从各种来源一起破解了它:
更新:这是我当前的输出代码,其中包含一些用于清理 & 符号的正则表达式。
<?
include("HLN/manager/connect.php");
$query = "SELECT * FROM hln_stations ORDER BY orderid ASC";
$result = mysql_query($query);
$num = mysql_num_rows ($result);
mysql_close();
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument();
header('Content-type: text/xml');
$xml->setIndent(true);
$xml->startElement('channels');
while ($row = mysql_fetch_assoc($result)) {
$xml->startElement("channel");
$xml->startElement("title");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['station_title']));
$xml->endElement();
$xml->startElement("descriptionline1");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['station_display_name']));
$xml->endElement();
$xml->startElement("descriptionline2");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['station_subtitle']));
$xml->endElement();
$xml->startElement("description");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['station_detailed_description']));
$xml->endElement();
$xml->startElement("sdimage");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['sdtv_thumbnail_graphic_url']));
$xml->endElement();
$xml->startElement("hdimage");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['hdtv_thumbnail_graphic_url']));
$xml->endElement();
$xml->startElement("uri");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['stream_url_or_playlist_url']));
$xml->endElement();
$xml->startElement("linktype");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&',$row['link_type']));
$xml->endElement();
$xml->endElement();
}
$xml->endElement();
$xml->flush();
?>
但我仍然需要解决突然出现的法语字符集问题。例如,如何用不会引起问题的内容替换 é 字符?
最佳答案
您在 Firefox 中遇到错误,表示格式不正确,因为检测到的字符集与您输出的字符集不匹配。我尝试了各种字符集组合,并且可以重现该问题。
您必须明确指定您的字符集,例如:
header('Content-type: text/xml; charset=UTF-8');
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument("1.0", "UTF-8");
如果在内容类型和 XML 中将字符集指定为 UTF-8 时出错,这意味着您的输入不是有效的 UTF-8,请尝试改用 ISO-8859-15,或重新编码您的输入。
您必须为站点的每个页面放置内容类型字符集 header ,包括输入数据的表单,否则您的特殊字符可能会被弄乱。此外,您必须连接到 mysql,指定要用于连接的字符集,并且该字符集应与表的字符集和排序规则相匹配。
假设您正在使用 UTF-8 使用 PHPMyAdmin 和 UTF-8 连接查看您的数据库,如果您看不到您的特殊字符,则意味着您做错了什么。
至于设备,如果你说它只能显示 ASCII 字符,当你输入 UTF-8 时它会为你做转换还是你必须给实体如:
Chérie
如果这两个选项不起作用,您可能希望转换为 ASCII,例如“Cherie”……但那将是最后的选择。
不使用数据库的概念代码证明:
<?php
header('Content-type: text/xml; charset=UTF-8');
$radioArr = array(
array("Chérie FM @Work", "http://www.listenlive.eu/cheriefm_atwork.m3u?p&test"),
array("Hélène FM", "http://broadcast.infomaniak.ch/helenefm-high.mp3.m3u")
);
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument("1.0", "UTF-8");
$xml->setIndent(true);
$xml->startElement('channels');
foreach ($radioArr AS $radio) {
$xml->startElement("channel");
$xml->startElement("title");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&', $radio[0]));
$xml->endElement();
$xml->startElement("uri");
$xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&', $radio[1]));
$xml->endElement();
$xml->endElement(); //end channel
}
$xml->endElement();
$xml->flush();
?>
关于php - 如何处理输出到 XML 的 HTML/php 格式的所有特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8058860/