使用Lable展示emoji表情

来源:互联网 发布:来自故宫的礼物 淘宝 编辑:程序博客网 时间:2024/06/14 09:15
1.在UIKit中的UILabel默认是可以展示emoji表情的,只是对于表情的编码方式有要求,微信中的表情信息的样式是这样的
<span class="emoji emoji1f380"></span>这里是信息的文字内容<span class="emoji emoji3120e3"></span>

其中的  1f380   3120e3  就是两个表情,但这是16进制的编码方式,在label中是不会显示表情的,我们就需要转换编码方式其实就是unicode编码。

2.转换编码的之前需要把要转换的文本拿出来,下面的代码就是把上面的字符串传入。

- (NSString *)filterHTML:(NSString *)html{    NSScanner * scanner = [NSScanner scannerWithString:html];    NSString * text = nil;    while([scanner isAtEnd] == NO)    {        [scanner scanUpToString:@"<" intoString:nil];        [scanner scanUpToString:@">" intoString:&text];        if ([html rangeOfString:@"<span"].location != NSNotFound)        {            //将文本中的表示emoji表情的字符拿出来            NSString * str = [html subStringFrom:@"emoji emoji" to:@"\">"];            //转换编码方式为emoji的编码            NSString * str1 = [NSString emojiWithStringCode:str];            //将带有标签的文本替换成emoji的编码            html = [html stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"<span class=\"emoji emoji%@\"></span>",str] withString:str1];        }    }    return html;}


3.其中转码为emoji编码的方法,是NSString的类别,下面是我从网上找到的代码

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





原创粉丝点击