西里尔字符RSS PHP MySQL

时间:2010-11-05 03:36:46

标签: php mysql

我正在尝试为一个主要有俄语文章的网站写一个RSS源,尽管有时候是英文。该网站是用php mysql构建的。  这是我访问网址时文本的样子:

  

Áåñåäà¹1èçöèêëà“Èçðàèëüèìû”

我做错了什么? 此外,我试图在文档的顶部添加这行代码,但它打破了它,我收到一个错误:

<?xml version="1.0" encoding="UTF-8"?>

这是我的PHP代码,不包括数据库连接信息。 我很绝望。请帮忙。

<?php
require_once ('cutils/db_connect.php3');
// PHP file that renders perfect Dynamic XML for MySQL Database result sets
// Script written by Adam Khoury @ www.developphp.com - April 05, 2010
// View the video that is tied to this script for maximum understanding
// -------------------------------------------------------------------
header("Content-Type: rss-http;"); //set the content type to xml
// Initialize the xmlOutput variable

$xmlBody = '
<rss version="2.0">

<channel>
<title>Name of your site</title>
<description>A description of your site</description>
<link>http://yoururl.com/</link>
<copyright>Your copyright information</copyright>';
// Connect to your MySQL database whatever way you like to here
mysql_connect("localhost","dbuser","dbpass") or die (mysql_error());
mysql_select_db("sinaius2_em") or die ("no database");
// Execute the Query on the database to select items(20 in this example)
$sql = mysql_query("SELECT `id`, `title`, `article_text`, `article_date` FROM `articles`ORDER BY `article_date` DESC LIMIT 0 , 15");
mysql_query("SET NAMES utf8");
while($row = mysql_fetch_array($sql)){
    // Set DB variables into local variables for easier use 
    $id = $row["id"]; 
    $title = $row["title"] ;  
    $date_time = strftime("%b %d, %Y", strtotime($row["article_date"])); 
    $description = $row["article_text"];  
    // Start filling the $xmlBody variable with looping content here inside the while loop 
    // It will loop through 20 items from the database and render into XML format
    $xmlBody .= "
<item> 
    <title>$title</title>
    <description>TEST</description>  
    <pubDate>$date_time</pubDate>
    <link>http://www.evreimir.com/article.php?id=$id</link> 
</item> ";
} // End while loop
mysql_close(); // close the mysql database connection_aborted
$xmlBody .= "</channel>
</rss>";
echo $xmlBody; // output the gallery data as XML file for flash
?>

3 个答案:

答案 0 :(得分:1)

一些(部分)建议:

<?xml 导致的错误可能是由于php.ini中的short_open_tags设置为ON。当PHP解释器到达<?时,它将其理解为PHP代码块的开头,然后抛出错误,因为下一个语句不被识别为PHP。您可以在php.ini中将设置更改为OFF,或者在文件开头使用ini_set()。另一种方法是将<与其余部分分开输出,如:

print '<'; print '?xml ...';

接下来,我看到您在发出SET NAMES ut8声明后发送SELECT。这样,它对相对于SELECT查询的连接设置完全没有影响。 SET NAMES确实应该是在INSERTSELECT之前发出的第一个声明。这也假设进入数据库的数据是以UTF-8开头的。看到数据库使用MySQL的出厂默认字符集和排序规则,我怀疑设置系统的人根本没有考虑字符集,因此UTF-8假设可能是错误的。

您应该做的是详细检查将原始数据写入数据库的脚本。如果该脚本中有一个SET NAMES,你应该在阅读记录时使用它,如果没有你应该避免它 - 否则你会导致你试图避免的非常不匹配。一般而言,您可以将数据库视为黑匣子存储引擎:只要您不在SQL代码中进行字符串操作,数据库就会完全返回到您的字节序列。插入它。普通的INSERT和SELECT并不关心它们移动的字节是ASCII,ISO - *还是多字节,它们只是盲目的移动器。因此,在读取数据库时应该使用的是与写入记录时使用的设置完全相同:这样您就可以获得最初存储的相同字节序列。

最后要发现的是最初存储数据的字符集。如果数据来自网页表单,则应检查该页面,特别是其字符集。浏览器具有显示此功能的功能(在Firefox中:菜单视图 - &gt;字符编码,在IE视图中 - &gt;编码)。如有疑问,请检查页面源是否有<meta http-equiv="content-type" content="text/html; charset=xxx">之类的明确声明以及Content-TYpe: text/html; charset=xxx之类的标头的HTTP标头。如果两者都存在且不匹配,则HTTP标头获胜。

最后一个资源(因为它在服务器上肯定很重)是使用mb_detect_encoding()检查从数据库返回的stings并将其用作iconv()的输入以将其转换为UTF-8:

setlocale(LC_ALL, "en_US.utf8"); /* or any other locale with 'utf8' in it */
$output = iconv(mb_detect_encoding($input), "UTF-8//IGNORE//TRANSLIT", $input);

希望这有帮助。

答案 1 :(得分:0)

您可以(也可能应该)在Content-Type标题中包含字符集。另外,我从未见过内容类型rss-http,我会使用text/xmlapplication/xml。还有一些更具体的内容类型,但there might be some issues with this。 RSS xml,因此通用xml内容类型都可以正常工作。

header("Content-Type: text/xml; charset=ISO-8859-1"); 

ISO-8859包含西里尔字符,但可能不是您的数据存储在here is a reference for various other Cyrillic charsets that are in-use中的字符集。无论如何,您应该指定在mysql数据库中使用的相同编码。您可以在mysql中使用show create table your_table_name来查看给定表(或表中单个列)的字符集是什么。

此外......在用户代理从XML文档中提取之后,RSS中的描述字段将作为HTML 处理。出于这个原因,我强烈建议您将商品描述的内容包装为CDATA。即便如此,您仍然需要对通常在HTML文本中实体编码的内容进行实体编码(例如,不是html标记的“小于”符号)。 Here's a good example page

<description><![CDATA[(5 &lt; 8) is math, but <b>this is bold text</b>]]></description>

请注意HTML <b>标记是如何不需要编码的,因为它们位于CDATA内部,但是小于号的符号无论如何都要编码,以便在CDATA描述中的其他HTML标记内对其进行转义。如果没有CDATA,您需要对描述标记的内容进行xml编码 - 这将要求上述示例中的小于实际上是“双重编码”。 (所以只需使用CDATA,它就容易得多,而且容易出错)。

答案 2 :(得分:0)

事实证明原始编码在windows-1251中,所以我将它添加到php文件的开头:header(“Content-Type:text / xml; charset = windows-1251”);现在所有的花花公子。