我正在尝试为一个主要有俄语文章的网站写一个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
?>
答案 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
确实应该是在INSERT
或SELECT
之前发出的第一个声明。这也假设进入数据库的数据是以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/xml
或application/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 < 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”);现在所有的花花公子。