iOS emoji表情转码 或者判断

如果项目中有评论或者信息恢复的地方,往往会用到emoji,有时候如后台不支持emoji,就会显示乱码错误,我们可以把emoji转成unicode编码或者utf8编码格式传给服务器。当然如果后台服务器接收的时候能做好判断识别最好,我们这边后台是支持的,我仅记录一下方法,以备不时之需。

先定义一个UITextView 并设置代理

设定一个宏定义,用来判断emoji

 #define MULITTHREEBYTEUTF16TOUNICODE(x,y) (((((x ^ 0xD800) << 2) | ((y ^ 0xDC00) >> 8)) << 8) | ((y ^ 0xDC00) & 0xFF)) + 0x10000

下面写代理方法实现的内容

 1 - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
 2 {
 3     NSString *hexstr = @"";
 4
 5     for (int i=0;i< [text length];i++)
 6     {
 7         hexstr = [hexstr stringByAppendingFormat:@"%@",[NSString stringWithFormat:@"0x%1X ",[text characterAtIndex:i]]];
 8     }
 9     NSLog(@"UTF16 [%@]",hexstr);
10
11     hexstr = @"";
12
13     long slen = strlen([text UTF8String]);
14
15     for (int i = 0; i < slen; i++)
16     {
17         //fffffff0 去除前面六个F & 0xFF
18         hexstr = [hexstr stringByAppendingFormat:@"%@",[NSString stringWithFormat:@"0x%X ",[text UTF8String][i] & 0xFF ]];
19     }
20     NSLog(@"UTF8 [%@]",hexstr);
21
22     hexstr = @"";
23
24     if ([text length] >= 2) {
25
26         for (int i = 0; i < [text length] / 2 && ([text length] % 2 == 0) ; i++)
27         {
28             // three bytes
29             if (([text characterAtIndex:i*2] & 0xFF00) == 0 ) {
30                 hexstr = [hexstr stringByAppendingFormat:@"Ox%1X 0x%1X",[text characterAtIndex:i*2],[text characterAtIndex:i*2+1]];
31             }
32             else
33             {// four bytes
34                 hexstr = [hexstr stringByAppendingFormat:@"U+%1X ",MULITTHREEBYTEUTF16TOUNICODE([text characterAtIndex:i*2],[text characterAtIndex:i*2+1])];
35             }
36
37         }
38         NSLog(@"(unicode) [%@]",hexstr);
39     }
40     else
41     {
42         NSLog(@"(unicode) U+%1X",[text characterAtIndex:0]);
43     }
44
45     return YES;
46 }

在输入的时候,会自动把输入内容转成相应的格式。

如果在有些地方不需要输入emoji表情,可以做相关限制。

我这边用到的是,如果用户输入emoji表情的时候,会给出提示

 1 //是否含有表情
 2 - (BOOL)stringContainsEmoji:(NSString *)string
 3 {
 4     __block BOOL returnValue = NO;
 5
 6     [string enumerateSubstringsInRange:NSMakeRange(0, [string length])
 7                                options:NSStringEnumerationByComposedCharacterSequences
 8                             usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
 9                                 const unichar hs = [substring characterAtIndex:0];
10                                 if (0xd800 <= hs && hs <= 0xdbff) {
11                                     if (substring.length > 1) {
12                                         const unichar ls = [substring characterAtIndex:1];
13                                         const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
14                                         if (0x1d000 <= uc && uc <= 0x1f77f) {
15                                             returnValue = YES;
16                                         }
17                                     }
18                                 } else if (substring.length > 1) {
19                                     const unichar ls = [substring characterAtIndex:1];
20                                     if (ls == 0x20e3) {
21                                         returnValue = YES;
22                                     }
23                                 } else {
24                                     if (0x2100 <= hs && hs <= 0x27ff) {
25                                         returnValue = YES;
26                                     } else if (0x2B05 <= hs && hs <= 0x2b07) {
27                                         returnValue = YES;
28                                     } else if (0x2934 <= hs && hs <= 0x2935) {
29                                         returnValue = YES;
30                                     } else if (0x3297 <= hs && hs <= 0x3299) {
31                                         returnValue = YES;
32                                     } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
33                                         returnValue = YES;
34                                     }
35                                 }
36                             }];
37
38     return returnValue;
39 }

通过调用该方法,如果返回的是YES则输入内容含有emoji,反之。

时间: 2024-10-11 10:51:14

iOS emoji表情转码 或者判断的相关文章

IOS Emoji表情

IOS Emoji 前言:我比较喜欢有趣的东西,有一些有趣的小东西,可能不是多么多么牛逼,也可能不需要多高深的技巧,也不会为其他什么强大的功能而服务,但是有时候将很多有趣的小东西组合起来运用,比如在你的app某个功能上适当添加这个有趣的小东西的时候,说不定就能起到锦上添花的作用,更能吸引用户.下面就粗略介绍IOS Emoji表情字符. 关于IOS Emoji我才刚刚了解,还有很多东西不是特别清楚,等待以后有时间深入探索更多的应用知识. 然后展示我之前运用到按钮上的一个案例,是不是有点意思: 这个

php mysql 存储 IOS Emoji表情失败和乱码问题

感谢伟大的网络,给我们带来了很多有用的信息 然后开始 项目需要给app提供接口,发现IOS开发存储Emoji表情失败,或者乱码,在这里给自己留个记录以及给大家带来一些参考 首先是字符集的问题,mysql字符集大多数使用的是utf8,需要把字符集更换成utf8mb4,因为UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,utf8mb4则扩展到一个字符最多能有4字节,并且兼容utf8 在mysql终端查看下mysql当前版本所支持的字符集,

iOS &#160;Emoji表情编码/解码

之前做弹幕的时候 遇到的表情编码解码问题 表情编码一般是使用unicode编码 ,编码之后的格式 \ud83d\ude18\ud83d\ude18world\u4e16\u754chaha\ud83d\ude17 //编码 NSString *uniStr = [NSString stringWithUTF8String:[_barrageText.text UTF8String]]; NSData *uniData = [uniStr dataUsingEncoding:NSNonLossyA

移动端不允许提交emoji表情判断

<!DOCTYPE html> <html lang="en"> <head> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <me

mysql支持IOS的Emoji表情

原因: UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 解决办法: 将Mysql的编码从utf8转换成utf8mb4 步骤: 1.修改mysql配置文件 my.ini default-character-set=utf8mb4 character-set-server=utf8mb4 2.加入 [client] port=3306 default-character-set=utf8mb4 [mysqld]下加入

【iOS开发】emoji表情的输入思路

1.自定义一个表情包类继承NSTextAttachment 2.每个emoji表情其实就是一张图片,并且每张图片都有统一的编号,也就是说一个emoji 3.将emoji的图片赋值给自定义的表情包类image属性,并且将emoji转为富文本 4.发送时将富文本转为对应图片编号发送给服务器

iOS 禁止输入空格、emoji表情

1.首先先遵循UITextField 的代理方法 UITextFieldDelegate 2.#pragma mark ------>> 使用键盘的代理方法对输入进行控制 监听的效果 <<------ // 这里返回 NO 就是不让键盘输入 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)stri

微信去除EMOJI表情

方法是: 方法是:return json_decode(preg_replace("#(\\\ue[0-9a-f]{3}|\\\ud83e|\\\udd14)#ie", "", json_encode($text))); 原理是: 进行微信公众号开发者接入的时候,与用户的对话互动中,涉及到的文本信息不仅仅是文字那么简单,其中可能还会包含着各种表情字符,例如「emoji表情」. 百科: Emoji 由于微信接口中对于emoji表情使用的是UTF-8的二进制字符串,并没

mysql utf8mb4与emoji表情[转]

MYSQL 5.5 之前, UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区, BMP是从哪到哪,到http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters这里看,基本就是0000-FFFF这一区. 从MYSQL5.5开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集. utf8mb4 is a superset of utf8 utf8mb4兼容utf8,且比utf8