我有一个小的php/mysql应用程序,我把它放在一个输入表格并存储在MySQL数据库中,并输出数据作为XML供无线电播放硬件设备使用.
问题是&符号和其他字符.用户正在描述各种无线电台,以及流式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();
?>
Run Code Online (Sandbox Code Playgroud)
但我仍然需要解决正在出现的法国字符集问题.如何用不会导致问题的东西替换é字符?
您在Firefox中出现错误,表示格式不正确,因为检测到的字符集与您输出的字符集不匹配.我尝试了各种字符集组合,可以重现这个问题.
您必须明确指定您的字符集,例如:
header('Content-type: text/xml; charset=UTF-8');
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument("1.0", "UTF-8");
Run Code Online (Sandbox Code Playgroud)
如果在内容类型中将字符集指定为UTF-8并且在XML中为您提供错误,则表示您的输入无效UTF-8,请尝试使用ISO-8859-15,或重新编码您的输入.
您必须为网站的每个页面添加内容类型字符集标题,包括输入数据的表单或您的特殊字符可能会混乱.此外,您还要连接到mysql,指定要用于连接的字符集,并且该字符集应与表的字符集和排序规则相匹配.
假设您正在使用UTF-8使用PHPMyAdmin和UTF-8连接查看您的数据库,如果您无法很好地看到您的特殊字符,则意味着您做错了什么.
至于设备,如果你说它只能显示ASCII字符,当你给UTF-8输入时它是否为你做转换,或者你必须给实体如下:
Chérie
Run Code Online (Sandbox Code Playgroud)
如果这两个选项不起作用,您可能希望转换为ASCII,例如"Cherie"......但这将是最后的选择.
不使用DB的概念代码证明:
<?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();
?>
Run Code Online (Sandbox Code Playgroud)