我正在用PHP編寫一些RSS提要,並且存在字符編碼問題。我應該在htmlentities()編碼之前或之後使用utf8_encode()嗎?例如,我有一個描述元素都與符號與中國文字,我不知道其中哪些是正確的:RSS源中的utf-8和htmlentities
$output = utf8_encode(htmlentities($source)); or
$output = htmlentities(utf8_encode($source));
爲什麼呢?
我正在用PHP編寫一些RSS提要,並且存在字符編碼問題。我應該在htmlentities()編碼之前或之後使用utf8_encode()嗎?例如,我有一個描述元素都與符號與中國文字,我不知道其中哪些是正確的:RSS源中的utf-8和htmlentities
$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正確編碼實體。
(編輯:我改變了我的意見之前,訂單根據評論沒有關係,這段代碼經過測試,效果很好)。
訂單確實重要!在htmlentities()之前的utf8_encode會改變它的行爲。先比較字符串urldecode('%E2%82%AC')和不應用utf8_encode()。 – Kornel 2008-11-26 21:36:46
你說得對,但是看起來先使用htmlentities是正確的方法(測試它)。改變了我的帖子以反映它。 – 2008-11-27 02:22:54
你想做$output = htmlentities(utf8_encode($source));
。這是因爲您想先將國際字符轉換爲合適的UTF8,然後將&符號(可能還包括一些UTF-8字符)轉換爲HTML實體。如果您先執行實體,則可能無法正確處理某些國際字符。
如果沒有您的國際字符會由函數utf8_encode被改變,那麼它並不重要的順序,你叫他們進來。
請勿使用htmlentities()
!
只需使用UTF-8字符。只要確保您在HTTP標頭(Content-Type:application/xml;charset=UTF-8
)中聲明瞭Feed的編碼或者在第一行使用<?xml version="1.0" encoding="UTF-8"?>
就可以在Feed中自己編碼。
忘記時間和使用CDATA部分可能會更容易。它的工作原理爲標題部分,它似乎並不支持編碼的HTML字符在Firefox的RSS瀏覽器:
<title><![CDATA[News & Updates " > » ☂ ☺ ☹ ☃ Test!]]></title>
第一:utf8_encode
function從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')
經過大量的試驗&錯誤,我終於找到了一種方法來正確顯示從UTF8編碼數據庫值的字符串,通過一個XML文件,在HTML頁面:
$output = '<![CDATA['.utf8_encode(htmlentities($string)).']]>';
我希望這可以幫助別人。
爲什麼不首先使用UTF-8? – Gumbo 2009-01-26 09:47:55