Iphone 如何在uiview中修复uilabel上的文本编码

Iphone 如何在uiview中修复uilabel上的文本编码,iphone,ios,objective-c,encoding,Iphone,Ios,Objective C,Encoding,我有一个奇怪的文本编码问题,我想不出来。奇怪的是,如果您在浏览器中从API提要在线签出文本,则文本不需要任何格式 这是我的密码: -(void) viewDidLoad { [super viewDidLoad]; NSString *jsonDealString = [NSString stringWithFormat:@"http://api.*****"]; NSLog(@"deal id is %@",dealId); // Download the

我有一个奇怪的文本编码问题,我想不出来。奇怪的是,如果您在浏览器中从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;
但当遇到空对象时,这会导致崩溃

我的崩溃日志输出状态:

*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*+[NSString stringWithCString:encoding:::NULL cString”

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


感谢您的帮助

崩溃是因为您正在向c字符串而不是对象发送消息。CStringUsingEncode:提供一个c字符串,您不能执行编码:


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

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

详细回答:

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

您传递的
nsStringEncodingConversionLowlossy
非常可疑。您不应该允许有损转换。您应该知道API的特定编码,并且应该使用它。类似地,您可以将其他示例代码中的编码切换为
NSISOLatin1StringEncoding
。虽然这类似于某些Unicode,但它不是Unicode编码,因此不应将其用于JSON


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

Json解析器倾向于设置NSNull对象而不是nil,所以你的崩溃可能是“无法识别的选择器发送到实例”崩溃,对吗?我在文章中添加了崩溃输出。奇怪的是,如果您在浏览器中从API提要在线签出文本,文本不需要任何格式。在传入之前检查cString的值如何?