1

我有一个奇怪的文本编码问题,我无法弄清楚。奇怪的是,如果您在浏览器中从 API 提要在线查看文本,则文本不需要任何格式。

这是我的代码:

-(void) viewDidLoad {

    [super viewDidLoad];

  NSString *jsonDealString = [NSString stringWithFormat:@"http://api.*****"];

    NSLog(@"deal id is %@",dealId);

    // Download the JSON
    NSString *jsonString = [NSString
                            stringWithContentsOfURL:[NSURL URLWithString:jsonDealString]
                            encoding:NSStringEncodingConversionAllowLossy|NSUTF8StringEncoding
                            error:nil];

    // Create parser for the api
    SBJSON *parser = [[SBJSON alloc] init];
    NSDictionary *results = [parser objectWithString:jsonString error:nil];

    [self setDisplayItems:[results objectForKey:@"results"]];

    NSDictionary *item = (NSDictionary *)[displayItems objectAtIndex:0];

    self.titleDeal.text = [item objectForKey:@"title"];

}

我能够使用以下方法纠正文本编码问题:

 // merchant name with encoding fix
NSString *correctStringTitleDeal = [NSString stringWithCString:[[[item objectForKey:@"merchant"] objectForKey:@"name"] cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
self.titleDeal.text = correctStringTitleDeal;

但是当遇到 Null 对象时会导致崩溃。

我的崩溃日志输出状态:

* 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'* +[NSString stringWithCString:encoding:]: NULL cString'

这是表格视图中出现的问题的屏幕截图(它也发生在应用程序的其他地方):

在此处输入图像描述

谢谢你的帮助

4

2 回答 2

1

崩溃是因为您将消息发送到 c 字符串,而不是对象。cstringUsingEncoding: 给出一个 c-string,你不能做编码之类的事情:

对于编码问题,如果您可以使用浏览器很好地阅读 API 中的文本,那么它将被编码为 HTML 而不是 UTF8 形式的 unicode。

于 2013-02-05T20:47:12.353 回答
1

简短回答:找出 API 的字符串编码并使用它。

更长的答案:

编码问题的最可能原因是 JSON 不是 UTF-8。规范要求 JSON 采用某种形式的 Unicode(参见RFC4627 第 3 节)。具体编码由前四个八位字节确定。再次,请参阅规范。

你的过世NSStringEncodingConversionAllowLossy非常可疑。您不应该允许有损转换。您应该知道 API 的具体编码并且应该使用它。同样,您将其他示例代码中的编码切换为NSISOLatin1StringEncoding. 虽然这类似于某些 Unicode,但它不是 Unicode 编码,因此永远不应该用于 JSON。

当然,这个特定的 API 可能违反规范并发送错误编码的 JSON。您可以与 API 提供者一起修复他们的 JSON,也可以使用他们提供的任何编码。但是你不应该猜测,你绝对不应该接受有损转换。

于 2013-02-05T21:20:20.890 回答