PHP Выводит XML в ASCII, когда мне нужен UTF-8

Хорошо, у меня есть еще один вопрос, тогда я думаю, что часть PHP моей программы будет готова к рок-н-роллу. Спасибо всем за помощь, которую вы мне дали!

У меня есть следующий файл PHP, загруженный на веб-сайт, чтобы служить веб-службой для моего приложения для извлечения данных из базы данных MySQL и возврата тех вещей, которые мне нужны в моем приложении, в форме XML. Я думаю, что он отформатирован правильно и как бы мне это понравилось (хотя любой и любой ввод, конечно, приветствуется). Я перейду к проблеме, которую я испытываю после фрагмента.

Чтобы увидеть результат, просто cURL этот URL (это тот же URL-адрес, который я вызываю в NSURL): 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 обнаружил ошибку: Error Domain = NSXMLParserErrorDomain Code = 9 "Операция не может быть выполнена. (NSXMLParserErrorDomain error 9.)" UserInfo = 0x7fbddd0b1a10 {NSXMLParserErrorColumn = 44, NSXMLParserErrorLineNumber = 1352, NSXMLParserErrorMessage = Ввод неправильный UTF-8, укажите кодировку! Байт: 0x85 0x3C 0x2F 0x50}

Я беру это, поскольку мой PHP-файл возвращает его данные в ASCII, когда он должен быть в UTF-8. Итак, мой вопрос: как мне получить его для вывода на UTF-8, чтобы NSXMLParser мог его разобрать?

Кажется, что ваша база данных MySQL не содержит кодированных данных UTF-8. В результате его вывод не в UTF-8, а в некоторой другой кодировке (возможно, iso-latin1 ?, но определенно не ASCII). Вы можете либо перекодировать из любой кодировки UTF-8 для отображения (см. PHP doc, например 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 . См. Другой вопрос для получения дополнительной информации. Так что всегда есть два решения выше.

Похоже, вам нужно объявить свой тип кодировки в XMLwriter.

Как и $xml->startDocument('1.0','utf-8'); Таким образом, ваша XML-кодировка объявляется, когда NSXML анализирует ее.

Если бы это был ваш ввод данных, тогда XMLwriter выдавал бы ошибку, потому что он принимал только UTF-8.

XML, который сгенерирован этим скриптом PHP, действителен. Проблема, похоже, не в этой части моей программы. Спасибо всем за очень полезную информацию.

введите описание изображения здесь