【问题标题】:php rss feed character encoding multilingual feed itemsphp rss 提要字符编码多语言提要项目
【发布时间】:2012-12-14 22:28:28
【问题描述】:

我为一个网站创建了一个 RSS 提要,但它有 2 种语言 - 希腊语和英语。 当一个项目的标题用希腊语写成时,除了 rss 提要,一切正常。

所以我虽然可以,但我必须在解析字符串之前更改编码。我失败了 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 存储在 db 中

编辑 2: 这似乎有效 ->

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

但在 W3C 验证器上我收到此错误:第 268 列:XML 解析错误::1:268:未定义实体

这里是突出显示的部分:

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

\x8f 和 \x8d 导致此错误。但为什么呢?

【问题讨论】:

  • 该字段如何存储在您的数据库中?
  • ΕΙΣΒΟΛΕΑΣ &amp; EVERSOR - O μЎَࠏ καταЏέει @ Gagarin 205 Live Music Space 看起来(大部分)对我来说很好。你用什么来查看输出? (我用 Notepad++ 设置了 Encoding->UTF8)
  • firefox 和一些 chrome rss 插件都不能使用它
  • 你有没有用“SET NAMES utf8”设置MySQL连接的编码?
  • 更改浏览器编码后是否正确显示?这些字符可能不是 utf8,尽管您希望它们是。

标签: php character-encoding rss


【解决方案1】:

应该是:header('Content-Type: application/rss+xml; charset=UTF-8');,你少了一个分号。您的数据已经是 UTF-8,当指定 UTF-8 时,htmlentities 计算出 &amp;theta; 证明了这一点。由于您的数据已经采用 UTF-8 格式,utf8_encode 会使情况变得更糟。

不需要任何转换,您应该检查正确的标题是否有任何变化。您的原始输出是正确的,只是它被解释为 Windows-1252 而不是 UTF-8。


顺便说一句,在 XML 中 &amp;mu;&amp;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 中正确显示,没有未定义的实体错误。

这只是补充信息,您的原始数据首先是正确的,因此无需执行任何操作。

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多