自定义表情键盘-将十六进制的编码转为emoji字符
2016-07-06 本文已影响1621人
ShenYj
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