php - 字符编码错误,无法通过 PHP 从 MySQL 写入有效的 XML

标签 php mysql xml utf-8 character-encoding

有问题的提要是:http://api.inoads.com/snowstorm/feed.xml

这是我用于生成的 PHP 代码:

<?php

$database =  'xxxx';
$dbconnect = mysql_pconnect('xxxx', 'xxxx', 'xxxx');
mysql_select_db($database, $dbconnect);

$query = "SELECT * FROM the_queue WHERE id LIKE '%'    ORDER BY id DESC LIMIT 25";
$result = mysql_query($query, $dbconnect);

while ($line = mysql_fetch_assoc($result))
        {
            $return[] = $line;
        }

$now = date("D, d M Y H:i:s T");

$output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
            <rss version=\"2.0\">
                <channel>
                    <title>The Queue</title>
                    <link>http://readapp.net</link>
                    <description>A curated reading list.</description>
                    <language>en-us</language>
                    <pubDate>$now</pubDate>
                    <lastBuildDate>$now</lastBuildDate>
            ";

foreach ($return as $line)
{
    $output .= "<item><title>".htmlspecialchars($line['title'])."</title>
    <description>".htmlspecialchars($line['description'])."</description>
                    <link>".htmlspecialchars($line['link'])."</link>
                    <pubDate>".htmlspecialchars($line['pubDate'])."</pubDate>
                </item>";
}
$output .= "</channel></rss>";

$fh = fopen('feed.xml', 'w');
fwrite($fh, $output);
?>

可能导致错误的原因是什么?

这是来自提要验证器的链接:http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Fapi.inoads.com%2Fsnowstorm%2Ffeed.xml

最佳答案

您说 XML 文件是 UTF-8,但是当我下载它并在我的文本编辑器中打开它时,它会自动检测到 windows latin1编码,引号显示完美。

如果我强制我的文本编辑器使用 UTF-8,它会显示一条错误消息,因为 UTF-8 编码存在非法字符。

因此,您的数据不是 UTF-8,而是 latin1。您需要确切地找出发生这种情况的位置。它可以是以下任何一个或几个:

用户输入内容的HTML页面是否设置为UTF-8?

否则,浏览器将发送 latin1 引号。要解决此问题,请在 <head> 中添加 first 标签需要:

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  ...
</head>

是否每个浏览器都正确遵守该页面 HTML 中的 UTF-8 设置?

如果您指定 UTF-8 并且页面包含该编码中的非法字符,一些浏览器可能决定使用不同的编码,尽管 <meta>标签。如何在每个浏览器中检查它是不同的。

插入数据库时​​的MySQL连接是否设置为使用UTF-8?

你需要在这里使用 UTF-8,否则 MySQL 可能会尝试为你转换编码,通常会破坏它们。设置编码:

$database =  'xxxx';
$dbconnect = mysql_pconnect('xxxx', 'xxxx', 'xxxx');
mysql_select_db($database, $dbconnect);
mysql_query('SET NAMES utf8', $dbconnect);

MySQL 表(和个别列)是否设置为使用 UTF-8?

同样,为了避免 MySQL 进行自己的错误转换,您需要确保它对表和单独的注释使用 UTF-8。对数据库进行结构转储并检查:

CREATE TABLE `the_queue` (
  ...
) ... DEFAULT CHARSET=utf8;

还要确保任何列上都没有这样的东西:

`description` varchar(255) CHARACTER SET latin1,

读取数据库时的MySQL连接是否设置为使用UTF-8?

您的读取连接也需要是 utf8 .所以仔细检查一下。

您是否在 PHP 中执行任何无法处理 UTF-8 的操作?

PHP 有一些函数不能用于 utf-8 字符串,因为它会破坏它们。其中一个功能是 htmlentities()所以请确保您始终使用 htmlspecialchars() .测试这一点的最简单方法是开始注释掉大块代码以查看编码中断的位置。

关于php - 字符编码错误,无法通过 PHP 从 MySQL 写入有效的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8455563/

相关文章:

php - 如何将sharepoint与php连接

XML 上的 SQL 迭代

php - SQL : Join not working

javascript - 为 PHP URL 中的一个变量发送多个值?

javascript - PHP 更改按钮文本并相应更新数据库

mysql - 由其他列输入

mysql - Nodejs + mysql2/promise 连接太多

xml - XSL身份副本

php - 易趣开发者改进

php - Firefox 中的 JQuery SYNC Ajax 调用错误