【问题标题】:Weird symbols from NSXMLParser来自 NSXMLParser 的奇怪符号
【发布时间】:2011-01-17 18:31:28
【问题描述】:

我遇到了一个问题;我尝试使用 NSXMLParser 解析的所有内容都以“†Êá”(元素名称,elementText ...)结束

我尝试了不同的来源(我想从我的服务器解析的来源,简单的NSString,以及来自网络的不同来源,它们提供 XML)并且每次都是“†Êá”。

//prepar request
//NSString *urlString = [NSString   stringWithFormat:@"http://192.168.1.102:8080/support/supportService"];
NSString *urlString = [NSString stringWithFormat:@"http://sites.google.com/site/iphonesdktutorials/xml/Books.xml"];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

//get response
NSHTTPURLResponse* urlResponse = nil;  
NSError *error = [[NSError alloc] init];  
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];
NSLog(@"Response Code: %d", [urlResponse statusCode]);
//if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) {
 NSLog(@"Response: %@", result);
 // responsecode here
 //}

NSXMLParser *parser = [[NSXMLParser alloc] initWithData: [ result dataUsingEncoding:NSASCIIStringEncoding]];
//NSXMLParser *parser = [[NSXMLParser alloc] initWithData: [ fakeResponse dataUsingEncoding:NSUTF8StringEncoding]];

[parser setDelegate:self]; // The parser calls methods in this class
//[parser setShouldProcessNamespaces:NO]; // We don't care about namespaces
//[parser setShouldReportNamespacePrefixes:NO]; //
//[parser setShouldResolveExternalEntities:NO]; // We just want data, no other stuff

[parser parse]; // Parse that data..

和委托方法

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
      NSLog(@"chars: %s", string);
  }

 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName  attributes:(NSDictionary *)attributeDict{


  NSLog(@"open: %s %s, %s", elementName, namespaceURI, qName);
   }

  - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {


   NSLog(@"close: %s", elementName); 
   }

我也尝试了不同的编码,例如 ANSI 和 UTF8 .. 但我仍然得到以下结果:

2010-02-17 09:29:18.377 SupportServiceWSTest[403:20b] Response Code: 200
2010-02-17 09:29:18.378 SupportServiceWSTest[403:20b] Response: <?xml version="1.0"
encoding="UTF-8"?><Books><Book id="1"><title>Circumference</title><author>Nicholas  
Nicastro</author><summary>Eratosthenes and the Ancient Quest to Measure the   
Globe.</summary></Book><Book id="2"><title>Copernicus Secret</title><author>Jack  
Repcheck</author><summary>How the scientific revolution began</summary></Book><Book 
id="3"><title>Angels and Demons</title><author>Dan Brown</author><summary>Robert 
Langdon is summoned to a Swiss research facility to analyze a cryptic symbol seared into 
the chest of a murdered physicist.</summary></Book><Book id="4"><title>Keep the 
Aspidistra Flying</title><author>George Orwell</author><summary>A poignant and 
ultimately hopeful look at class and society, Keep the Aspidistra Flying pays tribute 
to the stubborn virtues of ordinary people who keep the aspidistra 
flying.</summary></Book></Books>
2010-02-17 09:29:18.379 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.381 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.381 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.382 SupportServiceWSTest[403:20b] chars: †Êá
2010-02-17 09:29:18.382 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.383 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.383 SupportServiceWSTest[403:20b] chars: †Êá
2010-02-17 09:29:18.384 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.384 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.385 SupportServiceWSTest[403:20b] chars: †Êá
2010-02-17 09:29:18.385 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.386 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.386 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.387 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.387 SupportServiceWSTest[403:20b] chars: †Êá
2010-02-17 09:29:18.388 SupportServiceWSTest[403:20b] close: †Êá
2010-02-17 09:29:18.388 SupportServiceWSTest[403:20b] open: †Êá (null), (null)
2010-02-17 09:29:18.389 SupportServiceWSTest[403:20b] chars: †Êá

【问题讨论】:

    标签: iphone objective-c encoding nsxmlparser


    【解决方案1】:

    一个问题是您使用的是NSASCIIStringEncoding。 XML 是 UTF8 编码的(在 XML 响应中指定),因此您应该使用 NSUTF8StringEncoding

    另一个问题是您在 NSLog 调用 NSString 对象时使用了 %s,这不起作用。 %s 用于 C 字符串、以空结尾的字符数组,而不是对象。将 %s 替换为 %@。

    %@ 在NSLog 中使用时,将对任何与其匹配的参数对象调用description 方法。对于NSStrings 的描述会打印出字符串的内容。

    【讨论】:

    • 感谢您的提示!正如我所说,它与编码无关(尽管我在我的示例中使用了错误的 ne,但我将其更改为任何组合),但 %s -> %@ 把戏搞砸了!我现在只使用 objc 一个星期,而且我对它不是很熟悉。我想你真的在这个问题上救了我几个星期!! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多