Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting escaped UTF8 characters back to their original form

I'm trying to read strings from an array that's coming from a plist and print those strings.

The strings in the array contain escaped UTF8 characters - for example "Nuša Florjančič" becomes "Nu\u0161a Florjan\u010di\u010d" when read from the plist. There is no way to change the content of the plist, but my program needs to display the names properly.

The strange thing is that Objective-C seems to do this automatically when I'm hardcoding the string. However, if I get the string from the plist nothing happens at all.

To give you an example, here's some code:

NSString *name1 = @"Nu\u0161a Florjan\u010di\u010d";
NSString *name2 = [list objectAtIndex:0];       
NSLog(@"name 1: %@", name1);
NSLog(@"name 2: %@", name2);

[list objectAtIndex:0] contains @"Nu\u0161a Florjan\u010di\u010d" - the only difference is that it has been set via the plist editor.

The console output is:

2011-10-22 18:00:02.595 Test[13410:11c03] name 1: Nuša Florjančič
2011-10-22 18:00:02.595 Test[13410:11c03] name 2: Nu\u0161a Florjan\u010di\u010d

I've tried all sorts of things, including transforming the string into a C-string and then creating an NSString object with a UTF-8 encoding but nothing worked at all.

I'd really appreciate any pointers from you that might help me solve this seemingly mundane problem.

like image 388
Tobi Avatar asked Oct 22 '11 16:10

Tobi


2 Answers

It sounds like the string in the plist contains the characters "\u0161" rather than the Unicode character number 0x161. So you need to decode the \u escapes in the string you've extracted from the plist. NSString can do that for you using NSNonLossyASCIIStringEncoding:

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
    @autoreleasepool {
        NSString *name2escaped = @"Nu\\u0161a Florjan\\u010di\\u010d";
        NSString *name2 = [NSString
            stringWithCString:[name2escaped cStringUsingEncoding:NSUTF8StringEncoding]
            encoding:NSNonLossyASCIIStringEncoding];
        NSLog(@"name2 = %@", name2);
    }
    return 0;
}
like image 125
rob mayoff Avatar answered Oct 22 '22 17:10

rob mayoff


Other solution is parse your list string (I used to parse it before build it)

NSString yourFinalString = [NSString stringWithCString:[yourOriginalString cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];

(Looks like Croatian, i think latin1 will fit properly)

like image 26
VictorPurMar Avatar answered Oct 22 '22 17:10

VictorPurMar