【问题标题】:Difficulty parsing response containing characters like '\u00'难以解析包含“\u00”等字符的响应
【发布时间】:2011-10-28 05:50:57
【问题描述】:

我正在使用 NSXML Parser 在我的 iPhone 应用程序中进行解析。现在一切正常,除非数据是法语。

例如,来自服务器的数据为Ch\u00e9rie FM

现在在foundCharacters 方法的string 参数下,我只得到字符串,因为'Ch' 其余字符没有出现。所以最后我的字符串被截断为 'Ch' 而不是整个Cherie fm

可以做什么?

代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict
{   
    if (appDelegate.objPlayer.fromFlickrorRecommend == TRUE)
    {
        if([elementName isEqualToString:@"outline"] && [[attributeDict valueForKey:@"text"] isEqualToString:@"You may also like"])
        {
            flagCheck = 1;
        }
        else if ([elementName isEqualToString:@"outline"] && [[attributeDict valueForKey:@"text"] isEqualToString:@"Genres"]) 
        {
            flagCheck = 0;
        }
        if (flagCheck == 1 && [elementName isEqualToString:@"outline"])
        {
            if([[attributeDict valueForKey:@"type"] isEqualToString:@"audio"])
            {
                [appDelegate.objPlayer.recommendDataArray addObject:attributeDict];

            }
        }
    }
    else
    {
        if ([elementName isEqualToString:@"location"])
        {
            flagCheck = 2;
        }
        else if ([elementName isEqualToString:@"url"])
        {   
            flagCheck = 3;
        }
        else if ([elementName isEqualToString:@"name"])
        {   
            flagCheck = 4;
        }
    }   
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{ 
    if (flagCheck == 2)
    {
        flagCheck = -1;
        appDelegate.objPlayer.flickrCity = string;
    }
    else if(flagCheck == 3)
    {
        flagCheck = -1;
        appDelegate.objPlayer.stationURL = string;
    }
    else if(flagCheck == 4)
    {
        flagCheck = -1;
        appDelegate.playStationName = string;
    }
    //else if(flagCheck == 0) // change
//  {
//      appDelegate.playStationName = string;
//  }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
    //if (flagCheck == 1 && [elementName isEqualToString:@"outline"])
//  {
//      [appDelegate.objPlayer.recommendDataArray addObject:dataDictionary];
//      dataDictionary = nil;
//      [dataDictionary release];
//  }
}

【问题讨论】:

  • -parser:foundCharacters: 是否被多次调用?
  • 是的..但它没有引入字符串Ch\u00e9rie FM.的其他字符
  • 在foundCharacters方法下只显示Ch,其他字符\u00e9rie fm不出现。虽然 foundCharacters 方法被多次调用。
  • 第二次调用 foundCharacters 会得到什么?
  • 您如何获得正在解析的 XML 字符串?您是否验证了源字符串已在内存中正确组装,并且没有编码问题导致数据损坏?

标签: iphone objective-c xml-parsing nsxmlparser nsxml


【解决方案1】:

得到答案:

此链接在我通过 stackoverflow 解决与我的问题类似的问题时有所帮助。

Why does arrays handle strings containing swedish ÅÄÖ characters by using two or more indexes?

希望这对所有正在寻找解决方案的人有所帮助。 :)

【讨论】:

    【解决方案2】:

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 可能会被多次调用,因此您需要将找到的字符累积到NSMutableString 中。在Event-Driven XML Programming Guide 中有一个如何实现的示例。

    解析器对象可能会发送几个委托 parser:foundCharacters: 报告字符的消息 元素。因为字符串可能只是总字符的一部分 当前元素的内容,您应该将其附加到当前元素 字符的积累,直到元素发生变化。

    现在\u00e9é 的UTF-16,因此必须正确编码数据以解析过去\u00。因此,如果您的数据最初是一个字符串,您可以像这样从中获取数据。

    NSString *text = @"<node>Ch\u00e9rie</node>";
    //Important or the parser will stop after Ch
    NSData *utf16encode = [text dataUsingEncoding:NSUTF16StringEncoding];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:utf16encode];
    

    【讨论】:

    • 感谢您的回复。我会尽快尝试并回复您。 :)
    • 我发现 NSXMLParser 将 UTF-8 作为默认编码。上述NSData *utf16encode = [text dataUsingEncoding:NSUTF16StringEncoding];NSXMLParser *parser = [[NSXMLParser alloc] initWithData:utf16encode]; 的解决方案也不适用于我。仍然给出同样的问题。那么可以做些什么呢?
    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多