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条)

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度