在美出差中国程序员,利用emoji表情处理,横扫美国程序员

boox 2018-10-25

emoji在社交类APP很常用,比如发动态,圈子,还有回复评论,还有会话

在美出差中国程序员,利用emoji表情处理,横扫美国程序员

在玩弄emoji 我想这位大神更牛逼:http://www.jianshu.com/p/3bfeb201794a

他介绍了emoji的历史还有emoji的原理,最后是一份非常漂亮的emoji键盘Demo

我这里记录的是一个我在开发过程比较恶心的东西:

Unicode与utf-8的转码;


后台在处理emoji的态度,直接就是不处理,所以我们需要对emoji包括中文,数字,还有特殊字符进行编码还有解码

//编码

在美出差中国程序员,利用emoji表情处理,横扫美国程序员

//解码

在美出差中国程序员,利用emoji表情处理,横扫美国程序员

总想着事情就能这么轻松解决!!!

可是,然后,呵呵呵,你不去了解一下东西,还是不行的

果然,后台不作处理的情况下,如果返回JSON这就不行了,因为会默认带有转义字符: *** "\" *** 会导致下面这个情况:

在美出差中国程序员,利用emoji表情处理,横扫美国程序员

输出:

在美出差中国程序员,利用emoji表情处理,横扫美国程序员

果断百度另外的方法

//解码

- (NSString *)decodeEmoji{

NSString *tepStr1 ;

if ([self containsString:@"\\\u"]) {

tepStr1 = [self stringByReplacingOccurrencesOfString:@"\\\u"withString:@"\U"];

}else{

tepStr1 = [self stringByReplacingOccurrencesOfString:@"\\u"withString:@"\U"];

}

NSString *tepStr2 = [tepStr1 stringByReplacingOccurrencesOfString:@"""withString:@"\""];

NSString *tepStr3 = [[@""" stringByAppendingString:tepStr2]stringByAppendingString:@"""];

NSData *tepData = [tepStr3 dataUsingEncoding:NSUTF8StringEncoding];

NSString *axiba = [NSPropertyListSerialization propertyListWithData:tepData options:NSPropertyListMutableContainers format:NULL error:NULL];

return [axiba stringByReplacingOccurrencesOfString:@"\r\n"withString:@"\n"];

}

//编码

- (NSString *)encodeEmoji{

在美出差中国程序员,利用emoji表情处理,横扫美国程序员

这是从JSON解码与编码,其实原理也很简单:

  • A :就是把多余的转义斜杠扔掉,
  • B :然后Unicode转utf-8;
  • C :然后utf-8转Unicode;

这里我写了一个NSString的一个分类:#import "NSString+Emoji.h"

还添加了一些方法:

//判断是否存在emoji表情:因为emoji表情室友Unicode编码区间的

+ (BOOL)stringContainsEmoji:(NSString *)string

{

__block BOOL returnValue = NO;

[string enumerateSubstringsInRange:NSMakeRange(0, [string length])

options:NSStringEnumerationByComposedCharacterSequences

usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {

const unichar hs = [substring characterAtIndex:0];

if (0xd800 <= hs && hs <= 0xdbff) {

if (substring.length > 1) {

const unichar ls = [substring characterAtIndex:1];

const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;

if (0x1d000 <= uc && uc <= 0x1f77f) {

returnValue = YES;

}

}

} else if (substring.length > 1) {

const unichar ls = [substring characterAtIndex:1];

if (ls == 0x20e3) {

returnValue = YES;

}

} else {

if (0x2100 <= hs && hs <= 0x27ff) {

returnValue = YES;

} else if (0x2B05 <= hs && hs <= 0x2b07) {

在美出差中国程序员,利用emoji表情处理,横扫美国程序员

//判断是否存在中文

//因为要保证之前的utf-8的数据也能显示

- (BOOL)includeChinese

{

for(int i=0; i< [self length];i++)

{

int a =[self characterAtIndex:i];

if( a >0x4e00&& a <0x9fff){

return YES;

}

}

return NO;

}

//判断是否以中文开头

- (BOOL)JudgeChineseFirst{

在美出差中国程序员,利用emoji表情处理,横扫美国程序员

喜欢的话转发评论哦!需要源码的私信01即可获得哦

相关推荐