dphw5101 2014-10-09 20:21
浏览 57
已采纳

当我需要UTF-8时PHP以ASCII输出XML [重复]

This question already has an answer here:

Ok, I have one more question then I think the PHP part of my program will be ready to rock and roll. Thank you everyone for the help you've given me so far!

I have the following PHP file uploaded to a website to act as a web service for my app to retrieve data from a MySQL Database and return the things that I need in my app in the form of XML. I think it is formatted correctly and is how I would like it (though any and all input is of course welcome). I'll get to the problem I'm having after the snippet.

To see the output, simply cURL this URL (it's the same URL I'm calling in NSURL): http://jeffstockdale.com/API/get_blog_posts.php

The PHP file looks like this

<?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();

?>

And now to the problem. I go into my Xcode Project, create a NSURL (the file downloads correctly) and hand it over to my NSXMLParser, which then gives me the following error from parseErrorOccurred:

2014-10-09 15:03:41.114 AppName[8667:521529] NSXMLParser encountered an error: Error Domain=NSXMLParserErrorDomain Code=9 "The operation couldn’t be completed. (NSXMLParserErrorDomain error 9.)" UserInfo=0x7fbddd0b1a10 {NSXMLParserErrorColumn=44, NSXMLParserErrorLineNumber=1352, NSXMLParserErrorMessage=Input is not proper UTF-8, indicate encoding ! Bytes: 0x85 0x3C 0x2F 0x50 }

I'm taking that as my PHP file is returning it's data in ASCII when it needs to be in UTF-8. So my question is, how do I either get it to output to UTF-8 so NSXMLParser can parse it?

</div>
  • 写回答

3条回答 默认 最新

  • doumianfeng6979 2014-10-09 20:51
    关注

    It seems that your MySQL database does not contain UTF-8 encoded data. As a result it's output is not in UTF-8 but rather some other encoding (maybe iso-latin1? but definitely not ASCII). You may either re-encode from whatever encoding it is to UTF-8 for display (see the PHP doc, e.g. mb_convert_encoding), or re-encode your database.

    For the first solution, simply wrap the data obtained from the SQL query like so:

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

    Update: XMLWriter requires UTF-8 strings as input. So it cannot accept other encoding even if declaring the encoding with startDocument. See this other question for more information. So there's always the two solutions above.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色