【问题标题】:PHP Outputs XML in ASCII when I need UTF-8 [duplicate]当我需要 UTF-8 时,PHP 以 ASCII 格式输出 XML [重复]
【发布时间】:2014-10-09 20:21:45
【问题描述】:

好的,我还有一个问题,然后我认为我的程序的 PHP 部分将准备好摇滚。感谢大家迄今为止对我的帮助!

我将以下 PHP 文件上传到网站,作为我的应用程序的 Web 服务,以从 MySQL 数据库中检索数据并以 XML 的形式返回我的应用程序中需要的内容。我认为它的格式正确并且是我想要的(尽管当然欢迎任何和所有输入)。我会在 sn-p 之后解决我遇到的问题。

要查看输出,只需 cURL 这个 URL(它与我在 NSURL 中调用的 URL 相同): http://jeffstockdale.com/API/get_blog_posts.php

PHP 文件如下所示

<?php
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
mysql_select_db(DB_NAME);

$sql = "SELECT post_date_gmt, post_content, post_title FROM schema.wp_posts WHERE post_status = \"publish\" && post_type = \"post\" ORDER BY post_date_gmt DESC;";
$res = mysql_query($sql);

$xml = new XMLWriter();

$xml->openURI("php://output");
$xml->startDocument();
$xml->setIndent(true);

$xml->startElement('BlogPosts');

while ($row = mysql_fetch_assoc($res)) {

    $xml->startElement("Post");

    $xml->startElement("PostTitle");
    $xml->text($row['post_title']);
    $xml->endElement();

    $xml->startElement("PostDate");
    $xml->text($row['post_date_gmt']);
    $xml->endElement();

    $xml->startElement("PostContent");
    $xml->writeCData($row['post_content']);
    $xml->endElement();

    $xml->endElement();

}

$xml->endElement();

header('Content-type: text/html; charset=utf-8');
$xml->flush();

?>

现在来解决问题。我进入我的 Xcode 项目,创建一个 NSURL(文件正确下载)并将其交给我的 NSXMLParser,然后它从 parseErrorOccurred 给我以下错误:

2014-10-09 15:03:41.114 AppName[8667:521529] NSXMLParser 遇到错误:错误域=NSXMLParserErrorDomain Code=9“操作无法完成。(NSXMLParserErrorDomain 错误 9.)”UserInfo=0x7fbddd0b1a10 {NSXMLParserErrorColumn=44, NSXMLParserErrorLineNumber=1352, NSXMLParserErrorMessage=输入不是正确的 UTF-8,表示编码! 字节:0x85 0x3C 0x2F 0x50 }

我认为这是因为我的 PHP 文件在需要 UTF-8 格式时以 ASCII 格式返回它的数据。所以我的问题是,我如何让它输出到 UTF-8 以便 NSXMLParser 可以解析它?

【问题讨论】:

  • 那绝对不是 ASCII。对于它的价值,ASCII 会被接受为 UTF-8。
  • 你知道为什么它会给我这个错误吗?
  • 你检查过数据库连接编码是utf-8吗?
  • ThW 根据您的问题,我查看了 MySQL Workbench 并确认数据库正在编码 UTF-8。
  • @Kirkland:这只是您的数据库、表和列可能设置的元数据。这并不意味着所有数据都是 UTF-8 编码的。 NSXML 告诉你它不是。最好在传递 XML 之前检查它。

标签: php xml utf-8 ascii nsxmlparser


【解决方案1】:

您的 MySQL 数据库似乎不包含 UTF-8 编码的数据。因此,它的输出不是 UTF-8,而是其他一些编码(可能是 iso-latin1?但绝对不是 ASCII)。您可以将其从任何编码重新编码为 UTF-8 以供显示(请参阅 PHP 文档,例如 mb_convert_encoding),或重新编码您的数据库。

对于第一个解决方案,只需像这样包装从 SQL 查询中获得的数据:

...
$xml->text(mb_convert_encoding($row['post_title'], "UTF-8", "ISO-8859-1"));
// replace ISO-8859-1 (aka latin1) with the encoding actually used
...

更新: XMLWriter 需要 UTF-8 字符串作为输入。所以即使用startDocument声明编码也不能接受其他编码。有关更多信息,请参阅其他 question。所以总有上面两种解决方案。

【讨论】:

    【解决方案2】:

    看起来你需要在 XMLwriter 中声明你的编码类型。

    就像$xml-&gt;startDocument('1.0','utf-8'); 这样,当 NSXML 解析它时,你的 XML 编码就被声明了。

    如果是您的数据输入,那么 XMLwriter 会抛出错误,因为它只接受 UTF-8。

    【讨论】:

    • 在没有声明编码的情况下,NSXMLParser 已经需要 UTF-8,因为错误消息清楚地表明 xml 不是编码。
    • 这不可能是他的输入,因为 XMLWriter 只接受 UTF-8 作为输入而不会引发错误。
    • 我不认为 XMLWriter 验证任何东西。如果您未声明编码或声明“utf-8”,则您的输入将原封不动地通过它(这解释了上述问题)。否则,它们会从 utf-8 重新编码为您选择的任何内容,如果您的输入不是 utf-8,则会惨遭失败。
    • 我已经对 PHP 文件进行了调整,但仍然遇到同样的错误。我们是否认为错误可能出在我的解析代码中,而不是在此 PHP 文档返回的 XML 中?
    • 您是否尝试过将 XML 写入文件以确保 XMLWriter 获得良好的数据并且不会引发错误?
    【解决方案3】:

    此 PHP 脚本生成的 XML 有效。问题似乎并不存在于我程序的这一部分。感谢大家提供非常有用的信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 2019-02-23
      • 2016-10-11
      • 2011-12-05
      • 2014-03-07
      • 1970-01-01
      • 2014-08-30
      • 2011-03-16
      相关资源
      最近更新 更多