美文网首页
16进制 转成 Emoji表情

16进制 转成 Emoji表情

作者: 爱喝农药de清凉 | 来源:发表于2017-07-12 16:24 被阅读107次

链接:http://www.jianshu.com/p/51deb78814e1
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

感谢作者提供!
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

相关文章

网友评论

      本文标题:16进制 转成 Emoji表情

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