hanumanDev
hanumanDev

Reputation: 6614

How to fix text encoding on a uilabel in a uiview

I have a strange text encoding problem that I can't figure out. The strange this is that if you check out the text online from the API feed in a browser the text doesn't need any formatting.

Here's my code:

-(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"];

}

I was able to correct the text encoding problem using:

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

But that caused a crash when a Null object was encountered.

my crash log output states:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* +[NSString stringWithCString:encoding:]: NULL cString'

Here's a screenshot of the problem occurring in a table view (it's occurring elsewhere in the app too):

enter image description here

thanks for any help

Upvotes: 1

Views: 589

Answers (2)

Rob Napier
Rob Napier

Reputation: 299475

Short answer: Find out the string encoding of the API and use it.

Longer answer:

The most likely cause of encoding problems is that the JSON isn't in UTF-8. JSON is required by spec to be in some form of Unicode (see RFC4627 Section 3). The speicifc encoding is determined by the first four octets. Again, see the spec.

Your passing of NSStringEncodingConversionAllowLossy is extremely suspicious. You should not be allowing lossy conversion. You should know the specific encoding of the API and you should use it. Similarly, you switch encoding in your other example code to NSISOLatin1StringEncoding. While this is similar to some Unicode, it is not a Unicode encoding as so never should be used for JSON.

It's of course possible that this particular API is in violation of spec and is sending badly encoded JSON. You can either work with the API provider to fix their JSON, or you can use whatever encoding they are providing. But you shouldn't guess, and you definitely shouldn't accept lossy conversions.

Upvotes: 1

Gabriel
Gabriel

Reputation: 3359

The crash is because you are sending a message to a c-string, not to an object. cstringUsingEncoding: gives a c-string and you cannot do things like encode:

For the encoding problem, if you can read well the text from the API using a browser, then it is encoded for HTML instead of unicodes in UTF8 form.

Upvotes: 1

Related Questions