NSString with emoticons/emojis url encode

2020-03-01 02:58发布

I am trying to take the contents of a UITextField that may contain special characters and emojis and turn it into something I can pass in a GET request to a PHP service.

If I do not encode the string at all, the emojis show up just fine (I can see them in the DB and they come back to me properly)... but if I add special chars (~!@#$%, etc.) the GET request chokes.

So I run the string through the url encoder:

[commentText stringByAddingPercentEscapesUsingEncoding:NSNonLossyASCIIStringEncoding];

I am using the NSNonLossyASCIIStringEncoding to get the emojis out properly, which works, but using this to encode returns a nil string. In fact, the only encoding that does not return a nil is UTF8, but that munges up the emoji unicode with percent-escapes.

How do I do this? Do I have to write my own string replacement for this case, or is there an iOS way to do it that I am not seeing?

Cheers,

Chris

3条回答
劳资没心,怎么记你
2楼-- · 2020-03-01 03:08

Use this to escape emoji:

NSString *escapedEmoji = [NSString stringWithCString:[emojiString cStringUsingEncoding:NSNonLossyASCIIStringEncoding] encoding:NSUTF8StringEncoding];

And this to unescape emoji:

NSString *unescapedEmoji = [NSString stringWithCString:[escapedString cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding];
查看更多
虎瘦雄心在
3楼-- · 2020-03-01 03:10

You can use the below code to encode emoji string

NSString *uniText = [NSString stringWithUTF8String:[youremojistring UTF8String]];
NSData *msgData = [uniText dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *goodMsg = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding];
查看更多
贪生不怕死
4楼-- · 2020-03-01 03:29

NSNonLossyASCIIStringEncoding to stringByAddingPercentEscapesUsingEncoding: returns nil because the string you're passing in is not ASCII. Using NSUTF8StringEncoding percent escapes the emoji characters and that's the result I would expect. If your server-side middleware is not automatically unescaping the emoji from the query string, then you should look to do that in your server-side code if it's causing issues upstream.

查看更多
登录 后发表回答