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

标签 php html xml

我有一个我组装的小 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};)/','&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();

?>

但我仍然需要解决突然出现的法语字符集问题。例如,如何用不会引起问题的内容替换 é 字符?

最佳答案

您在 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&#xE9;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};)/','&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();

?>

关于php - 如何处理输出到 XML 的 HTML/php 格式的所有特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8058860/

相关文章:

php - 在 Yii 框架中配置数据库连接

php - 如果语言不在 URL 中,如何在谷歌分析中检查每种语言的访问数据

java - 从 JAXB 迁移到 Castor 的简单方法?

java - Android TextInput 提示文本颜色

xml - 查找 xml 节点的完整 xpath

php - 完整性约束违反PDO方法(创建查询)php

javascript - 我想在点击选择大学后显示我的模态框,怎么办?

jquery - 在 jQuery 中检查单选按钮

javascript - 使用 jquery 设置表列样式

javascript - 需要解决这个 javascript 编码问题