2012-12-14 3 views
2

웹 사이트 용 RSS 피드를 만들었지 만 그리스어와 영어의 2 개 언어가 있습니다. 항목에 그리스어로 된 제목이있는 경우 rss 피드를 제외한 모든 항목이 올바르게 작동합니다.PHP rss 피드 문자 인코딩 다국어 피드 항목

그래도 문자열을 구문 분석하기 전에 인코딩을 변경해야합니다. 나는 100 % 실패했다.

php가 제공하는 모든 인코딩 기능을 시도했습니다. iconv, ut8_encode, mb_convert_encoding 또한 mb_detect_encoding strict입니다. 또한 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'] 인코딩이 작동하지만 운이 없다고 생각했다.

편집 : 텍스트 utf8_general_ci로 DB에 저장

편집 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

텍스트 utf8_general_ci – Syd

+0

'ΕΙΣΒΟΛΕΑΣ & EVERSOR - O ЎЎࠏκκκ @ @ @ Gagarin 205 라이브 뮤직 스페이스' 나에게 잘 보입니다. 출력물을보기 위해 무엇을 사용하고 있습니까? (나는 Notepad ++를 사용하고 Encoding-> UTF8을 설정했다) –

답변

4

다음과 같아야합니다 : header('Content-Type: application/rss+xml; charset=UTF-8');, 세미콜론이 누락되었습니다. 귀하의 데이터는 UTF-8이 지정되어있을 때 에 의해 입증 된 UTF-8이 &theta;입니다. 데이터가 이미 UTF-8이기 때문에 utf8_encode은 더 악화 될 것입니다.

변환 할 필요가없는 경우 적절한 헤더가 변경되는지 확인해야합니다. 원시 출력이 정확합니다. UTF-8 대신 Windows-1252로 해석됩니다.


Btw, 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> 

을 그럼에도 불구하고,이 정의되지 않은 엔티티하는 오류없이, 크롬 및 파이어 폭스에서 제대로 표시됩니다.

이것은 단지 보충 정보 일 뿐이므로 원시 데이터가 처음부터 올바른 것이므로 아무 것도 수행 할 필요가 없습니다.

+0

대단히 감사합니다 :) – Syd