Objective-C: NSString not being entirely decoded from UTF-8

ios, nsstring, objective-c

Solution

The `\u2019` syntax isn't part of UTF-8 encoding, it's a piece of JSON-specific syntax. `NSString` parses UTF-8, not JSON, so doesn't understand it.

You should use `NSJSONSerialization` to parse the JSON then pull the string you want from the output of that.

So, for example:

NSError *error = nil;
id rootObject = [NSJSONSerialization
                      JSONObjectWithData:receivedData
                      options:0
                      error:&error];

if(error)
{
    // error path here
}

// really you'd validate this properly, but this is just
// an example so I'm going to assume:
//
//    (1) the root object is a dictionary;
//    (2) it has a string in it named 'url'
//
// (technically this code will work not matter what the type
// of the url object as written, but if you carry forward assuming
// a string then you could be in trouble)

NSDictionary *rootDictionary = rootObject;
NSString *url = [rootDictionary objectForKey:@"url"];

NSLog(@"URL was: %@", url);

Problem

I'm querying a web server which returns a JSON string as `NSData`. The string is in UTF-8 format so it is converted to an `NSString` like this. ``` NSString *receivedString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding]; ``` However, some UTF-8 escapes remain in the outputted JSON string which causes my app to behave erratically. Things like `\u2019` remain in the string. I've tried everything to remove them and replace them with their actual characters. The only thing I can think of is to replace the occurances of UTF-8 escapes with their characters manually, but this is a lot of work if there's a quicker way! Here's an example of an incorrectly parsed string: ``` {"title":"The Concept, Framed, The Enquiry, Delilah\u2019s Number 10 ","url":"http://livebrum.co.uk/2012/05/31/the-concept-framed-the-enquiry-delilah\u2019s-number-10","date_range":"31 May 2012","description":"","venue":{"title":"O2 Academy 3 ","url":"http://livebrum.co.uk/venues/o2-academy-3"} ``` As you can see, the URL hasn't been completely converted. Thanks,

Original source