iosobjective-cencodingnsstringencoding

NSString Decoding


I have a situation, I don't know what causing it.

I have got a string from server like this

NSString *str=@"\\u3060\\u3044\\u3053\\u3093\\u3001\\u5927\\u6839\\n";

I am trying to decode it using the following code..

NSLog(@"%@",[self decodeString:str]);


-(NSString*)decodeString:(NSString *)inputString{
    NSData *utfStringData=[inputString dataUsingEncoding:NSUTF8StringEncoding];
    NSString *output=[[NSString alloc] initWithData:utfStringData encoding:NSNonLossyASCIIStringEncoding];
    return output;
}

I get nil as output.

But when I remove extra "\" from the input string, NSString itself shows the proper wording without even passing into decodeString function, see below

enter image description here

So I decided the replace the extra "\" from input string using following code

inputString=[inputString stringByReplacingOccurrencesOfString:@"\\\\" withString:@"\\"];

Above code doesn't work either.

My question is -> What am I doing wrong? How does it work?

Thanks for Helping.


Solution

  • You need to use CFStringTransform to convert unescape unicode characters. CFStringTransform can perform real magic like transliterations between greek and latin (or about any known scripts), but it can also be used to do mundane tasks like unescaping strings from a server:

    NSString *str=@"\\u3060\\u3044\\u3053\\u3093\\u3001\\u5927\\u6839\\n";
    NSString *convertedString = [str mutableCopy];
    
    CFStringRef transform = CFSTR("Any-Hex/Java");
    CFStringTransform((__bridge CFMutableStringRef)convertedString, NULL, transform, YES);
    NSLog(@"convertedString: %@", convertedString);     //convertedString: だいこん、大根\n
    

    CFStringTransform is really powerful. It supports a number of predefined transforms, like case mappings, normalizations or unicode character name conversion. You can even design your own transformations.

    OS X 10.11 and iOS 9 add the following method to Foundation:

    - (nullable NSString *)stringByApplyingTransform:(NSString *)transform reverse:(BOOL)reverse;
    

    Here is the code with the above method:

    NSString *convertedString = [str stringByApplyingTransform:@"Any-Hex/Java" reverse:YES];
    NSLog(@"convertedString: %@", convertedString);     //convertedString: だいこん、大根\n