簡體   English   中英

RSS Feed中的utf-8和htmlentities

[英]utf-8 and htmlentities in RSS feeds

我正在用PHP編寫一些RSS提要並且正在處理字符編碼問題。 我應該在htmlentities()編碼之前或之后使用utf8_encode()嗎? 例如,我在描述元素中有兩個&符號和中文字符,我不確定哪個是正確的:

$output = utf8_encode(htmlentities($source)); or
$output = htmlentities(utf8_encode($source));

為什么?

將字符集傳遞給htmlentities函數非常重要,因為默認值為ISO-8859-1:

utf8_encode(htmlentities($source,ENT_COMPAT,'utf-8'));

您應首先應用htmlentities以允許utf8_encode正確編碼實體。

(編輯:我之前的意見改變了,根據評論,訂單無關緊要。此代碼經過測試並且運行良好)。

第一: utf8_encode函數從ISO 8859-1轉換為UTF-8。 因此,如果輸入編碼/字符集是ISO 8859-1,則只需要此功能。 但是你為什么不首先使用UTF-8?

第二:你不需要htmlentities 您只需要htmlspecialchars來替換字符引用的特殊字符。 htmlentities將替換可以使用UTF-8直接編碼的“太多”字符。 重要的是,您還使用ENT_QUOTES引號樣式替換單引號。

所以我的提議:

// if your input encoding is ISO 8859-1
htmlspecialchars(utf8_encode($string), ENT_QUOTES)

// if your input encoding is UTF-8
htmlspecialchars($string, ENT_QUOTES, 'UTF-8')

不要使用htmlentities()

只需使用UTF-8字符。 只需確保在HTTP標頭( Content-Type:application/xml;charset=UTF-8 )中聲明feed的編碼或使用<?xml version="1.0" encoding="UTF-8"?>在Feed本身中失敗<?xml version="1.0" encoding="UTF-8"?>在第一行。

忘記htmlentities並使用CDATA部分可能更容易。 它適用於標題部分,在Firefox的RSS查看器中似乎不支持編碼的HTML字符:

<title><![CDATA[News & Updates  " > » ☂ ☺ ☹ ☃  Test!]]></title>

你想做$output = htmlentities(utf8_encode($source)); 這是因為您希望首先將國際字符轉換為正確的UTF8,然后將&符號(可能還有一些UTF-8字符)轉換為HTML實體。 如果先執行實體,則可能無法正確處理某些國際字符。

如果utf8_encode不會更改您的國際字符,那么您調用它們的順序無關緊要。

經過多次試驗和錯誤,我終於找到了一種方法,可以正確顯示從utf8編碼的數據庫值到xml文件的字符串到html頁面:

$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>';

我希望這可以幫助別人。

暫無
暫無

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

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