【问题标题】:iPhone, special characters in JSON ResponseiPhone,JSON 响应中的特殊字符
【发布时间】:2010-11-30 23:23:18
【问题描述】:

编写一个 iphone 应用程序,我从返回 JSON 的 REST API 获取数据。我的问题是,一些数据嵌入了特殊字符并且我得到了错误。示例:

MartÌn
Petite-RiviËre-Saint-FranÁois

这是我当前的代码:

NSString *jsonString = [[NSString alloc] 
                            initWithData:receivedData 
                            encoding:NSUTF8StringEncoding];
NSMutableArray *tempResults = [[[jsonString JSONValue] 
                            objectForKey:@"getRegionResortsLastUpdatedResponse"] 
                            objectForKey:@"return"];

只要数据中有特殊字符,“jsonString”就返回“(null)”,否则一切正常。

这是我自己可以处理的事情,还是需要修改 API 才能输出字符代码?

【问题讨论】:

    标签: iphone objective-c json api rest


    【解决方案1】:

    如果-initWithData:encoding: 返回 nil,则几乎可以肯定您的数据未以请求的编码进行编码。我怀疑您没有发送 UTF8,而是发送一些其他编码,例如 Windows 代码页或 Latin1。请参阅NSString documentation 中的字符串编码。

    【讨论】:

      【解决方案2】:

      使用以下函数对您的代码进行编码我这样做并且非常适合我......

      + (NSData*) resolveXmlSpecialEntities:(NSData*)xmlData
      {
          if (xmlData == nil) 
              return nil;
          if ([xmlData length] == 0)
              return xmlData;
      
          NSMutableString* xmlString = [[NSMutableString alloc] initWithData:xmlData encoding:NSUTF8StringEncoding];
          [xmlString replaceOccurrencesOfString:@""" withString:@"\"" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"<" withString:@"##??##" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@">" withString:@"##?!##" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"<br>" withString:@"##br##" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"</br>" withString:@"##/br##" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"<b>" withString:@"##b##" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"</b>" withString:@"##/b##" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"<center>" withString:@"##center##"options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"</center>" withString:@"##/center##" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"##??##![CDATA[" withString:@"" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"]]##?!##" withString:@"" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"&" withString:@"##ampersand##" options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
          [xmlString replaceOccurrencesOfString:@"##ampersand##nbsp;" withString:@" " options:NSLiteralSearch range:NSMakeRange(0, [xmlString length])];
      
          xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
          [xmlString release];
          return xmlData;
      }
      
      + (NSString*) stringByRemovingResolversInXmlString:(NSString*)xmlString
      {
          NSMutableString* stringToChange = [NSMutableString stringWithString:xmlString];
      
          [stringToChange replaceOccurrencesOfString:@"##??##" withString:@"<" options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
          [stringToChange replaceOccurrencesOfString:@"##?!##" withString:@">" options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
          [stringToChange replaceOccurrencesOfString:@"##br##" withString:@"<br>" options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
          [stringToChange replaceOccurrencesOfString:@"##/br##" withString:@"</br>" options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
          [stringToChange replaceOccurrencesOfString:@"##b##" withString:@"<b>" options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
          [stringToChange replaceOccurrencesOfString:@"##/b##" withString:@"</b>" options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
          [stringToChange replaceOccurrencesOfString:@"##center##" withString:@"<center>"options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
          [stringToChange replaceOccurrencesOfString:@"##/center##" withString:@"</center>" options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
          [stringToChange replaceOccurrencesOfString:@"##ampersand##" withString:@"&" options:NSLiteralSearch range:NSMakeRange(0, [stringToChange length])];
      
          return [NSString stringWithString:stringToChange];
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 2017-07-28
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        相关资源
        最近更新 更多