Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSNonLossyASCIIStringEncoding returns nil

I'm working on default emojis in iOS. i'm able to successfully encode and decode default emojis using NSNonLossyASCIIStringEncoding encoding.

Its working fine when i sent emojis with simple text but it returns nil when some special character is added in string. How do i make it work ?

Code :

    testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\";
    NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
    NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 
    // here strBody is nil
like image 600
aqsa arshad Avatar asked Feb 03 '17 09:02

aqsa arshad


2 Answers

The problem is due to different encodings you have used for encoding and decoding.

 testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\";
 NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];

Here you have converted a string to data using UTF8 encoding. This means it will convert the unicode characters in 1-4 bytes depending on the unicode character used. for e.g. \ude09 will translate to ED B8 89. The explanation of the same is available in wiki. Basically is uses the following technique:

enter image description here

Now if you try to decode this to string using ascii encoding like below

   NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 

The above is bound to fail as it cannot decode ED B8 89 or similar unicode data to ascii string. That's why it returns an error.

If the data was ascii encoded, it would have used literal ascii hex for the conversion. So \ude09 would have become "5c 75 64 65 30 39"

So the correct conversion would be :

    testString=":;Hello \ud83d\ude09\ud83d\ude00 ., <> /?\";
    NSData *data = [testString dataUsingEncoding:NSNonLossyASCIIStringEncoding];
    NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 

The question for you is why you want it to encode as UTF8 and decode as ASCII?


For emojis, please try the below

        testString=":;Hello \\ud83d\\ude09\\ud83d\\ude00 ., <> /?";
        NSData *data = [testString dataUsingEncoding:NSUTF8StringEncoding];
        NSString *strBody = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding]; 
like image 166
manishg Avatar answered Nov 15 '22 17:11

manishg


If you simply want to have emojis in your code as literals, there are two options:

A. Just do it:

NSString *hello = @"😀😎+_)(&#&)#&)$&$)&$)^#%!!#$%!";
NSLog(@"%@", hello);

B. Add the codes as UTF32

NSString *hello = @"\U0001F600\U0001F60E+_)(&#&)#&)$&$)&$)^#%!!#$%!";
NSLog(@"%@", hello);

Both prints: 😀😎+_)(&#&)#&)$&$)&$)^#%!!#$%!

I really do not get your problem.

like image 28
Amin Negm-Awad Avatar answered Nov 15 '22 18:11

Amin Negm-Awad