• 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,反之。

  • 相关阅读:
    UML 依赖泛化关联实现聚合组合的 Java实现
    android 混淆文件proguard.cfg详解
    Java TCP/IP与HTTP协议个人总结(原创)
    OSI与TCP/IP协议区别
    重复造轮没有意义
    mysql的MVCC(多版本并发控制)
    springboot集成spring-session及spring-redis实现session共享
    Redis分布式锁的正确实现方式
    Spring Boot+Spring Security+Spirng Data Jpa实现登录权限验证并实现自动登录
    一次搞定Jpa的@OneToMany和@ManyToMany注解
  • 原文地址:https://www.cnblogs.com/zhanghuanan/p/5576826.html
Copyright © 2020-2023  润新知