美文网首页emoji
自定义表情键盘-将十六进制的编码转为emoji字符

自定义表情键盘-将十六进制的编码转为emoji字符

作者: ShenYj | 来源:发表于2016-07-06 17:00 被阅读1621次
    Swift:
    import Foundation
    
    extension String{
        
        func emojiStr() -> String {
            //1.在一段字符串中查找十六进制的字符串
            let scanner = NSScanner(string: self)
            //2.将查找的字符串转换为十六进制的数字
            var value: UInt32 = 0
            scanner.scanHexInt(&value)
            //3.将十六进制的数字转化为 unicode字符
            let charCode = Character(UnicodeScalar(value))
            //4.将uniconde字符转换 字符串
            
            return "\(charCode)"
            
        }
    }
    
    Objective-C:

    .h

    #import <Foundation/Foundation.h>
    
    @interface NSString (Emoji)
    /**
     *  将十六进制的编码转为emoji字符
     */
    + (NSString *)emojiWithIntCode:(long)intCode;
    
    /**
     *  将十六进制的编码转为emoji字符
     */
    + (NSString *)emojiWithStringCode:(NSString *)stringCode;
    - (NSString *)emoji;
    
    /**
     *  是否为emoji字符
     */
    - (BOOL)isEmoji;
    @end
    

    .m

    #import "NSString+Emoji.h"
    #define EmojiCodeToSymbol(c) ((((0x808080F0 | (c & 0x3F000) >> 4) | (c & 0xFC0) << 10) | (c & 0x1C0000) << 18) | (c & 0x3F) << 24)
    
    @implementation NSString (Emoji)
    
    + (NSString *)emojiWithIntCode:(long)intCode {
        NSString * s = [NSString stringWithFormat:@"%ld",intCode];
        int symbol = EmojiCodeToSymbol([s intValue]);
        NSString *string = [[NSString alloc] initWithBytes:&symbol length:sizeof(symbol) encoding:NSUTF8StringEncoding];
        if (string == nil) { // 新版Emoji
            string = [NSString stringWithFormat:@"%C", (unichar)intCode];
        }
        return string;
    }
    
    - (NSString *)emoji
    {
        return [NSString emojiWithStringCode:self];
    }
    
    + (NSString *)emojiWithStringCode:(NSString *)stringCode
    {
        char *charCode = (char *)stringCode.UTF8String;
        long intCode = strtol(charCode, NULL, 16);
        return [self emojiWithIntCode:intCode];
    }
    
    // 判断是否是 emoji表情
    - (BOOL)isEmoji
    {
         BOOL returnValue = NO;
             
         const unichar hs = [self characterAtIndex:0];
         // surrogate pair
         if (0xd800 <= hs && hs <= 0xdbff) {
             if (self.length > 1) {
                 const unichar ls = [self characterAtIndex:1];
                 const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
                 if (0x1d000 <= uc && uc <= 0x1f77f) {
                     returnValue = YES;
                 }
             }
         } else if (self.length > 1) {
             const unichar ls = [self characterAtIndex:1];
             if (ls == 0x20e3) {
                 returnValue = YES;
             }
         } else {
             // non surrogate
             if (0x2100 <= hs && hs <= 0x27ff) {
                 returnValue = YES;
             } else if (0x2B05 <= hs && hs <= 0x2b07) {
                 returnValue = YES;
             } else if (0x2934 <= hs && hs <= 0x2935) {
                 returnValue = YES;
             } else if (0x3297 <= hs && hs <= 0x3299) {
                 returnValue = YES;
             } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
                 returnValue = YES;
             }
         }
        
        return returnValue;
    }
    @end
    
    

    相关文章

      网友评论

      本文标题:自定义表情键盘-将十六进制的编码转为emoji字符

      本文链接:https://www.haomeiwen.com/subject/vimkjttx.html