如何处理输出到XML的HTML/php格式的所有特殊字符

alp*_*der 1 html php xml

我有一个小的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};)/','&amp;',$row['station_title']));
     $xml->endElement();
     $xml->startElement("descriptionline1");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['station_display_name']));
     $xml->endElement();

     $xml->startElement("descriptionline2");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['station_subtitle']));
     $xml->endElement();

     $xml->startElement("description");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['station_detailed_description']));
     $xml->endElement();

     $xml->startElement("sdimage");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['sdtv_thumbnail_graphic_url']));
     $xml->endElement();

     $xml->startElement("hdimage");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['hdtv_thumbnail_graphic_url']));
     $xml->endElement();

     $xml->startElement("uri");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['stream_url_or_playlist_url']));
     $xml->endElement();

     $xml->startElement("linktype");
          $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;',$row['link_type']));
     $xml->endElement();

 $xml->endElement();
}

$xml->endElement();


$xml->flush();

?>
Run Code Online (Sandbox Code Playgroud)

但我仍然需要解决正在出现的法国字符集问题.如何用不会导致问题的东西替换é字符?

sti*_*vlo 5

您在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&#xE9;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};)/','&amp;', $radio[0]));
     $xml->endElement();

     $xml->startElement("uri");
     $xml->writeRaw(preg_replace('/&(?![A-Za-z0-9#]{1,7};)/','&amp;', $radio[1]));
     $xml->endElement();

     $xml->endElement(); //end channel
}

$xml->endElement();
$xml->flush();

?>
Run Code Online (Sandbox Code Playgroud)