2008-11-21 20 views
8

我正在用PHP編寫一些RSS提要,並且存在字符編碼問題。我應該在htmlentities()編碼之前或之後使用utf8_encode()嗎?例如,我有一個描述元素都與符號與中國文字,我不知道其中哪些是正確的:RSS源中的utf-8和htmlentities

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

爲什麼呢?

+0

爲什麼不首先使用UTF-8? – Gumbo 2009-01-26 09:47:55

回答

17

它傳遞的字符集htmlentities函數是很重要的,因爲默認是ISO-8859-1:

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

您應該首先申請htmlentities,以便允許utf8_encode正確編碼實體。

(編輯:我改變了我的意見之前,訂單根據評論沒有關係,這段代碼經過測試,效果很好)。

+0

訂單確實重要!在htmlentities()之前的utf8_encode會改變它的行爲。先比較字符串urldecode('%E2%82%AC')和不應用utf8_encode()。 – Kornel 2008-11-26 21:36:46

+0

你說得對,但是看起來先使用htmlentities是正確的方法(測試它)。改變了我的帖子以反映它。 – 2008-11-27 02:22:54

1

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

如果沒有您的國際字符會由函數utf8_encode被改變,那麼它並不重要的順序,你叫他們進來。

5

請勿使用htmlentities()

只需使用UTF-8字符。只要確保您在HTTP標頭(Content-Type:application/xml;charset=UTF-8)中聲明瞭Feed的編碼或者在第一行使用<?xml version="1.0" encoding="UTF-8"?>就可以在Feed中自己編碼。

1

忘記時間和使用CDATA部分可能會更容易。它的工作原理爲標題部分,它似乎並不支持編碼的HTML字符在Firefox的RSS瀏覽器:

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

第一: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') 
0

經過大量的試驗&錯誤,我終於找到了一種方法來正確顯示從UTF8編碼數據庫值的字符串,通過一個XML文件,在HTML頁面:

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

我希望這可以幫助別人。