0

我试图从这个 URL 检索 XML Google 天气 API:

http://www.google.com/ig/api?weather=,,,24467280,39606640&hl=ar

它是阿拉伯语。

我使用:NSURLConnection 来检索这些数据,然后通过 NSXMLParser 对其进行解析。

接收到的数据未正确编码。导入后我尝试将其放入 XML 文件中,发现数据如下:

<?xml version="1.0"?><xml_api_reply version="1">
<weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" ><forecast_information><city data=""/><postal_code data=""/><latitude_e6 data="21429730"/><longitude_e6 data="39828370"/><forecast_date data="2012-03-14"/><current_date_time data="2012-03-14 17:00:00 +0000"/><unit_system data="SI"/></forecast_information><current_conditions><condition data="’«›Ú"/><temp_f data="97"/><temp_c data="36"/><humidity data="«·—ÿÊ»…: &#x662;&#x662;&#x66A;"/><icon data="/ig/images/weather/sunny.gif"/><wind_condition data="«·—Ì«Õ: Éʻ »”—⁄… 8 fl„/”«⁄…"/></current_conditions><forecast_conditions><day_of_week data="«·√—»⁄«¡"/><low data="23"/><high data="37"/><icon data="/ig/images/weather/mostly_sunny.gif"/><condition data="„‘„” ›Ì √€·» «·√Êfi« "/></forecast_conditions><forecast_conditions><day_of_week data="«·Œ„Ì”"/><low data="20"/><high data="35"/><icon data="/ig/images/weather/mostly_sunny.gif"/><condition data="„‘„” ›Ì √€·» «·√Êfi« "/></forecast_conditions><forecast_conditions><day_of_week data="«·Ã„⁄…"/><low data="18"/><high data="33"/><icon data="/ig/images/weather/mostly_sunny.gif"/><condition data="„‘„” ›Ì √€·» «·√Êfi« "/></forecast_conditions><forecast_conditions><day_of_week data="«·”» "/><low data="19"/><high data="33"/><icon data="/ig/images/weather/mostly_sunny.gif"/><condition data="„‘„” ›Ì √€·» «·√Êfi« "/></forecast_conditions></weather></xml_api_reply>

当然,我从 NSXMLParser 得到错误:

错误域 = NSXMLParserErrorDomain 代码 = 9“操作无法完成。(NSXMLParserErrorDomain 错误 9。)”

这意味着 xml 数据已损坏。

如果我将 Google 的链接更改为:

http://www.google.com/ig/api?weather=,,,21429730,39828370&hl=en

(现在注意英语),一切正常..

我尝试通过以下方式对检索到的阿拉伯 XML 数据进行编码:

NSString * encodedString = [[NSString alloc] initWithBytes:recievedData.bytes length:recievedData.length encoding:NSStringEncodingConversionAllowLossy];

然后我通过以下方式将内容放入文件中:

[[NSFileManager defaultManager] createFileAtPath:filePath contents:[encodedString dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

现在的内容更好,但仍然是错误的,现在的内容:

<?xml version="1.0"?><xml_api_reply version="1"><weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" ><forecast_information><city data=""/><postal_code data=""/><latitude_e6 data="21429730"/><longitude_e6 data="39828370"/><forecast_date data="2012-03-14"/><current_date_time data="2012-03-14 17:00:00 +0000"/><unit_system data="SI"/></forecast_information><current_conditions><condition data="ÕÇÝò"/><temp_f data="97"/><temp_c data="36"/><humidity data="ÇáÑØæÈÉ: &#x662;&#x662;&#x66A;"/><icon data="/ig/images/weather/sunny.gif"/><wind_condition data="ÇáÑíÇÍ: ÌäæÈ ÈÓÑÚÉ 8 ßã/ÓÇÚÉ"/></current_conditions><forecast_conditions><day_of_week data="ÇáÃÑÈÚÇÁ"/><low data="23"/><high data="37"/><icon data="/ig/images/weather/mostly_sunny.gif"/><condition data="ãÔãÓ Ýí ÃÛáÈ ÇáÃæÞÇÊ"/></forecast_conditions><forecast_conditions><day_of_week data="ÇáÎãíÓ"/><low data="20"/><high data="35"/><icon data="/ig/images/weather/mostly_sunny.gif"/><condition data="ãÔãÓ Ýí ÃÛáÈ ÇáÃæÞÇÊ"/></forecast_conditions><forecast_conditions><day_of_week data="ÇáÌãÚÉ"/><low data="18"/><high data="33"/><icon data="/ig/images/weather/mostly_sunny.gif"/><condition data="ãÔãÓ Ýí ÃÛáÈ ÇáÃæÞÇÊ"/></forecast_conditions><forecast_conditions><day_of_week data="ÇáÓÈÊ"/><low data="19"/><high data="33"/><icon data="/ig/images/weather/mostly_sunny.gif"/><condition data="ãÔãÓ Ýí ÃÛáÈ ÇáÃæÞÇÊ"/></forecast_conditions></weather></xml_api_reply>

NSXMLParser 现在没有给我错误,但文本导致不可读。

对不起这个大问题。

谁能帮我?

4

2 回答 2

0

我用过:ASIHTTPRequest

它收到了编码良好的阿拉伯语数据,他们在文档中提到:

ASIHTTPRequest will attempt to read the text encoding of the received data from the Content-Type header. If it finds a text encoding, it will set responseEncoding to the appropriate NSStringEncoding. If it does not find a text encoding in the header, it will use the value of defaultResponseEncoding (this defaults to NSISOLatin1StringEncoding).

When you call [request responseString], ASIHTTPRequest will attempt to create a string from the data it received, using responseEncoding as the source encoding.

我曾经[request responseString]将接收到的文本响应存储到临时文件中,然后我通过 NSXMLParser 从文件中读取了数据,但实际上;我可以使用 ASIHTTPRequest 中名为:“将响应直接下载到文件”的功能,而不是我所做的..

顺便说一句,我的代码现在运行良好......

于 2012-03-17T06:21:20.020 回答
0

将 [oe=char_set] 参数添加到 google url,如下所示:

`http://www.google.com/ig/api?weather=Cairo,Egypt&hl=ar&oe=utf-8`
于 2012-03-18T12:26:42.147 回答