当我需要UTF-8时,PHP输出ASCII格式的XML

当我需要UTF-8时,PHP输出ASCII格式的XML,php,xml,utf-8,ascii,nsxmlparser,Php,Xml,Utf 8,Ascii,Nsxmlparser,好的,我还有一个问题,然后我想我的程序的PHP部分将准备好摇滚乐。谢谢大家到目前为止对我的帮助 我将以下PHP文件上载到一个网站,作为我的应用程序的web服务,从MySQL数据库检索数据,并以XML的形式返回我的应用程序中需要的内容。我认为它的格式是正确的,这是我想要的(当然欢迎任何和所有的输入)。在这段代码之后,我将着手解决我遇到的问题 要查看输出,只需卷曲此URL(它与我在NSURL中调用的URL相同): PHP文件如下所示 <?php mysql_connect(DB_HOST,

好的,我还有一个问题,然后我想我的程序的PHP部分将准备好摇滚乐。谢谢大家到目前为止对我的帮助

我将以下PHP文件上载到一个网站,作为我的应用程序的web服务,从MySQL数据库检索数据,并以XML的形式返回我的应用程序中需要的内容。我认为它的格式是正确的,这是我想要的(当然欢迎任何和所有的输入)。在这段代码之后,我将着手解决我遇到的问题

要查看输出,只需卷曲此URL(它与我在NSURL中调用的URL相同):

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,然后它会从ParseErrorOccessed中给出以下错误:

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


我的PHP文件在需要UTF-8格式时返回ASCII格式的数据。所以我的问题是,如何将其输出到UTF-8以便NSXMLParser能够解析它?

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

对于第一种解决方案,只需将从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
声明编码,它也无法接受其他编码。有关详细信息,请参阅此其他文件。因此,上面总是有两种解决方案。

看起来,您需要在XMLWriter中声明编码类型

类似于
$xml->startDocument('1.0','utf-8');
这样,当NSXML解析xml编码时,就会声明它


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

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


那绝对不是ASCII。因为ASCII值多少钱,它会被接受为UTF-8。你知道为什么它会给我这个错误吗?你检查过数据库连接编码是UTF-8吗?根据你的问题,我通过MySQL Workbench查看并确认db是UTF-8编码的。@Kirkland:这只是met您的数据库、表和列可能已经设置了a-data。这不能意味着所有数据都是UTF-8编码的。NSXML告诉您不是。在传递XML之前,最好检查它。在没有声明编码的情况下,NSXMLParser已经期望UTF-8,因为错误消息清楚地表明XML没有编码。因为XMLWrite,它不能作为他的输入r只接受UTF-8作为输入而不抛出错误。我认为XMLWriter不会验证任何东西。如果您不声明编码或声明“UTF-8”,则输入将不受影响地通过它(这解释了上述问题)。否则,它们将从utf-8重新编码到您选择的任何位置,如果您的输入不是utf-8,则会失败。我已对PHP文件进行了调整,但仍会遇到相同的错误。我们是否认为错误可能出现在我的解析代码中,而不是此PHP文档返回的XML中?您是否尝试过编写XM是否将XML写入程序添加到一个文件中,以确保XMLWriter获得了良好的数据,并且没有抛出错误?