2012-12-14 66 views
2

我爲一個網站創建了一個rss feed,但它有2種語言 - 希臘語和英語。 當一個項目有一個用希臘語寫的標題時,一切正常,除了rss提要。php rss feed字符編碼多種語言的feed項目

所以我雖然好,我必須在解析字符串之前更改編碼。我失敗了100%。

我試過每個編碼函數php提供的:iconv,ut8_encode,mb_convert_encoding也mb_detect_encoding嚴格而不是。我也用HTML實體,但似乎沒有任何工作

的源代碼生成RSS是這樣的:

function construct_rss($results, $cat = null) 
{ 

    if($results == false) 
    { 
     exit; 
    } 

    header('Content-Type: application/rss+xml charset=UTF-8'); 


    $rssfeed = '<?xml version="1.0" encoding="utf-8" ?>'; 
    $rssfeed .= '<rss version="2.0">'; 
    $rssfeed .= '<channel>'; 
    $rssfeed .= '<title>domain.com RSS feed</title>'; 
    $rssfeed .= '<link>http://www.domain.com</link>'; 
    if($cat == null) 
    { 
     $rssfeed .= '<description>Upcoming events</description>'; 
    } 
    else 
    { 
     $rssfeed .= '<description>Upcoming events - ' . $cat . '</description>'; 
    } 
    $rssfeed .= '<language>en-us</language>'; 
    $rssfeed .= '<copyright>Copyright (C) 2012 domain.com</copyright>'; 


    foreach ($results as $key => $event) 
    { 
     $exp = explode(',',$event['vName']); 
     $vName = $exp[0]; 

     $rssfeed .= '<item>'; 
     $rssfeed .= '<title>' . $event['eTitle'] . ' @ ' . $vName . '</title>'; 
     $rssfeed .= '<description>' . htmlentities('<a href="http://www.domain.com/event.php?eid=' . $event['id'] .'"><img WIDTH="150" HEIGHT="220" style="width:150px;height:220px;padding-bottom:10px;padding-right:10px;" src="http://'.$_SERVER['SERVER_NAME'].'/image.php?source='.urlencode('events/'.$event['folder'].'/images/default/' . $event['file_1']).'&w=150&h=220&out=raw"></a>' . '<p>' . $event['eDescr'] . '</div>') . '</description>'; 
     $rssfeed .= '<link>http://www.'.$_SERVER['SERVER_NAME'].'/events/' . urlencode($event['eCategory']) . '/' .urlencode($event['url']). '</link>'; 
     $rssfeed .= '<pubDate>' . date("D, d M Y H:i:s O", strtotime($event['dStart'] . ' ' . $event['tStart'])) . '</pubDate>'; 
     $rssfeed .= '</item>'; 
    } 

    $rssfeed .= '</channel>'; 
    $rssfeed .= '</rss>'; 

    echo $rssfeed; 

} 

這裏是一個原始輸出:

<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"> 
<channel> 
<title>domain.com RSS feed</title> 
<link>http://www.domai.com</link> 
<description>Upcoming events</description> 
<language>en-us</language><copyright>Copyright (C) 2012 domain.com</copyright> 
<item> 
<title>ΕΙΣΒΟΛΕΑΣ & EVERSOR - O μÏθος καταÏÏέει @ Gagarin 205 Live Music Space</title> 
<description>&lt;a href=&quot;http://www.domain.com/event.php?eid=209&quot;&gt;&lt;img WIDTH=&quot;150&quot; HEIGHT=&quot;220&quot; style=&quot;width:150px;height:220px;padding-bottom:10px;padding-right:10px;&quot; src=&quot;http://www.comain.com/image.php?source=events%2F985d6bfa8e35df69471b1ecdb9ed187e%2Fimages%2Fdefault%2Feisvo.jpg&amp;w=150&amp;h=220&amp;out=raw&quot;&gt;&lt;/a&gt;&lt;p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot;&gt;&amp;Epsilon;&amp;Iota;&amp;Sigma;&amp;Beta;&amp;Omicron;&amp;Lambda;&amp;Epsilon;&amp;Alpha;&amp;Sigma; &amp;amp; EVERSOR - &quot;&amp;Omicron; &amp;Mu;&amp;Upsilon;&amp;Theta;&amp;Omicron;&amp;Sigma; &amp;Kappa;&amp;Alpha;&amp;Tau;&amp;Alpha;&amp;Rho;&amp;Rho;&amp;Epsilon;&amp;Epsilon;&amp;Iota;&quot; TOUR LIVE @ &amp;Alpha;&amp;Theta;&amp;Eta;&amp;Nu;&amp;Alpha; (GAGARIN205), &amp;Sigma;&amp;Alpha;&amp;Beta; 22/12&lt;/span&gt;&lt;br style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot; /&gt;&lt;br style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot; /&gt;&lt;span style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot;&gt;doors open: 20.00&lt;/span&gt;&lt;br style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot; /&gt;&lt;span style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot;&gt;ticket price: 10e&lt;/span&gt;&lt;br style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot; /&gt;&lt;span style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot;&gt;guests: 12os Pithikos &amp;amp; Hatemost&lt;/span&gt;&lt;br style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot; /&gt;&lt;span style=&quot;color: #333333; font-family: lucida grande, tahoma, verdana, arial, sans-serif; font-size: 13px; line-height: 16px;&quot;&gt;opening: Gelws&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><link>http://www.www.domain.com/events/Hip-Hop+Rap/%CE%95%CE%99%CE%A3%CE%92%CE%9F%CE%9B%CE%95%CE%91%CE%A3-EVERSOR-%CE%9F-%CE%9C%CE%A5%CE%98%CE%9F%CE%A3-%CE%9A%CE%91%CE%A4%CE%91%CE%A1%CE%A1%CE%95%CE%95%CE%99-0</link> 
<pubDate>Sat, 22 Dec 2012 20:00:00 +0200</pubDate> 
</item> 
</channel> 
</rss> 

正如你所看到的問題在於該項目的標題。

如果任何人都可以指向一個方向或什麼,因爲我無法弄清楚這一個。我想通過轉換$event['eTitle']編碼它會工作,但沒有運氣。

編輯:存儲在數據庫爲TEXT utf8_general_ci

編輯2:這似乎工作 - >

utf8_encode(htmlentities($event['eTitle'],ENT_COMPAT,'utf-8'))

但W3C驗證我得到這個錯誤:塔268: XML解析錯誤:1:268:未定義實體

這裏是突出顯示的部分:

EVERSOR - O &mu;Ã\x8fÂ\x8d&theta; 

\ x8f和\ x8d會導致此錯誤。但爲什麼?

+0

字段如何存儲在數據庫中? –

+0

text utf8_general_ci – Syd

+0

'ΕΙΣΒΟΛΕΑΣ&EVERSOR - OμЎࠏκαταЏέει@ Gagarin 205 Live Music Space' 看起來(大部分)都對我很好。你用什麼來查看輸出? (我用記事本++和設置編碼 - > UTF8) –

回答

4

它應該是:header('Content-Type: application/rss+xml; charset=UTF-8');,你錯過了一個分號。您的數據已經是UTF-8,當指定UTF-8時,htmlentities正在制定&theta;。由於您的數據已經在UTF-8中,因此utf8_encode會使它變得更糟。

沒有必要進行任何轉換,您應該檢查正確的標題是否會改變任何內容。你的原始輸出是正確的,只是它被解釋爲Windows-1252而不是UTF-8。


順便說一句,在XML中 &mu;&theta; 默認情況下未定義的實體。這顯示了一個例子如何定義實體,但不是真正有效:

<?xml version="1.0" encoding="utf-8" ?> 
<!DOCTYPE channel 
[ 
    <!ENTITY mu "&#924;"> 
    <!ENTITY theta "&#920;"> 
]> 
<channel> 
EVERSOR - O &mu;Ã\x8fÂ\x8d&theta; 
</channel> 

儘管如此,它就會在Chrome和Firefox正確顯示,沒有未定義的實體誤差修改。

這只是補充信息,您的原始數據是正確的,所以不需要做任何事情。

+0

非常感謝你:) – Syd