簡體   English   中英

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

[英]how to handle all special characters in HTML/php form that outputs to 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();

?>

但是我仍然需要解決正在出現的法語字符集問題。 例如,如何用不會引起問題的東西替換é字符?

您在Firefox中遇到錯誤,提示格式不正確,因為檢測到的字符集與您輸出的字符集不匹配。 我嘗試了各種字符集組合,並可能重現此問題。

您必須明確指定字符集,例如:

header('Content-type: text/xml; charset=UTF-8');
$xml = new XMLWriter();
$xml->openURI("php://output");
$xml->startDocument("1.0", "UTF-8");

如果在內容類型中將字符集指定為UTF-8並使用XML會給您帶來錯誤,則意味着您的輸入不是有效的UTF-8,請改用ISO-8859-15,或重新編碼您的輸入。

您必須在網站的每個頁面上放置內容類型字符集標題,包括用於輸入數據的表格,否則您的特殊字符可能會被弄亂。 此外,您必須連接到mysql,以指定要用於連接的字符集,該字符集應與表的字符集和排序規則匹配。

假設您使用的是UTF-8,則使用PHPMyAdmin和UTF-8連接查看數據庫,如果看不到特殊字符,則表示您做錯了。

對於設備,如果您說它只能顯示ASCII字符,那么當您輸入UTF-8輸入時,它會為您執行轉換嗎?還是必須提供諸如以下這樣的實體:

Ch&#xE9;rie 

如果這兩個選項不起作用,則可能要轉換為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();

?>

如果您要真正“清理法語字符”(刪除)

怎么做( iconv )?

iconv('utf8', 'ascii//TRANSLIT', $text);

使用CDATA包裝數據。 相反writeRaw()使用writeCData()請參見下面的示例。

// CData output
$xml->startElement('title');
$xml->writeCData($row['station_subtitle']);
$xml->endElement();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM