ios emoji 表情在 跨平台之间的发送 (二)、coding

直接开始正题吧.

如果转载 注明出处

将一个 emoji的表情 转换为 [e]U+1F604[/e]

一个分两个大的步骤 发送时候的编码 和 接收时候的解码

1.编码1.1 表情转换为[e]U+1F604[/e]

@"INSERT INTO SEmoji VALUES (1,’U+1F604′,’0xF0 0x9F 0x98 0x84′,’0xD83D 0xDE04′,’E415′,’smiles_01_01.png’,NULL)"];

由于我的转换是依靠数据库查表(这个表不是很全,如果大家需要我可以传上来给大家看一下)完成的,所以先需要把emoji表情转换为utf8 执行查表 最后输出U+1F604 拼接成[e]U+1F604[/e]

1.1.1 转换为 utf8

1.1.2 utf8转换格式

1.1.3 查询数据库

查询数据库跟sqlite的使用相同,我使用的是三方插件FMDatabase 具体网上使用的方法很多,也可以直接写sqlite语句

1.2 在字符串中截取出emoji

虽然我们可以将emoji表情转换为U+1F604的样子 但是如何区分汉字 与emoji呢

这个时候就需要用到字符串的分割。

在iOS 以及mac 中 汉字的长度 英文的长度都为了1 但是emoji的长度为2 利用这个特点 我们就可以判断这个是emoji表情,将其转换。

+(NSString *)convertToSendString:(NSString *)baseStr{NSMutableString *sendString=[[NSMutableString alloc]init];for (int i =0 ; i<baseStr.length;) {//NSString *tmpStr=[baseStr substringWithRange:NSMakeRange(i,1)];//每次取1个长度NSLog(@"%@ length is %u",tmpStr,tmpStr.length);if ([tmpStr UTF8String] == NULL) {//如果不对 就取2个 那么肯定就是emoji表情了NSString *tmpStr=[baseStr substringWithRange:NSMakeRange(i,2)];//调用函数转换查询字符串NSString *tmpSendStr=[self emojiSelectUnicodeWithUTF8:tmpStr];[sendString appendString:tmpSendStr];i+=2;}else{[sendString appendString:tmpStr];i++;}NSLog(@" %@ %u",sendString,i);}return sendString;}到这里我们就完成了编码。

2 接收数据(解码)

pc android 方式类似,如果能支持unicode 字符串 那么直接获取U+1F604 输出即可,如果不支持,那么获取png图片显示即可。

iOS 端直接支持unicode字符 方法如下

//这段函数作用是将 U+1F591 转换为 \U0001F591//如果为 U+2500 那么就是补全为 \U00002500+(NSString *)convertSimpleUnicodeStr:(NSString *)inputStr{NSString *strUrl = [inputStr stringByReplacingOccurrencesOfString:@"U+" withString:@""];int unicodeIntValue= strtoul([strUrl UTF8String],0,16);UTF32Char inputChar = unicodeIntValue ;// 变成utf32inputChar = NSSwapHostIntToLittle(inputChar); // 转换成Little 如果需要NSString *sendStr = [[NSString alloc] initWithBytes:&inputChar length:4 encoding:NSUTF32LittleEndianStringEncoding];NSLog(@"%@",sendStr);return sendStr;}+(NSMutableString *)convertOrgUnicodeToPrintUnicode:(NSString *)orgUnicode{NSMutableString *sendStr = [[NSMutableString alloc]init];NSRange range = [orgUnicode rangeOfString:@" "];if (range.location != NSNotFound) {NSLog(@"found at location = %d, length = %d",range.location,range.length);NSString *tmpStrLeft=[orgUnicode substringToIndex:range.location];NSString *tmpStrRight=[orgUnicode substringFromIndex:range.location+1];NSLog(@"%@,%@",tmpStrLeft,tmpStrRight);//做转换[sendStr appendString:[self convertSimpleUnicodeStr:tmpStrLeft]];//获取剩下右边的[sendStr appendString:[self convertOrgUnicodeToPrintUnicode:tmpStrRight]];}else{[sendStr appendString:[self convertSimpleUnicodeStr:orgUnicode]];}return sendStr;}+(NSString *)convertReceviceStringMaybeHasContainEmoji:(NSString *)receiveString{// NSMutableString *tmpSendString=[[NSMutableString alloc]initWithString:@"U+1F1EB U+1F1F7"];NSMutableString *backStr = [[NSMutableString alloc]init];NSRange rangeEstart = [receiveString rangeOfString:@"[e]"];if (rangeEstart.location != NSNotFound) {//找到[e]后//1.先把之前的赋值到 backstrNSLog(@"find [e] at location = %d, length = %d",rangeEstart.location,rangeEstart.length);NSString *tmpStrLeft=[receiveString substringToIndex:rangeEstart.location];[backStr appendString:tmpStrLeft];//NSLog(@"backStr is %@",backStr);//2.再去找[/e]NSRange rangeEend = [receiveString rangeOfString:@"[/e]"];if (rangeEend.location != NSNotFound) {//找到[e]也找到[/e] 截取中间字符串NSString *tmpMidStr=[receiveString substringWithRange:NSMakeRange(rangeEstart.location+rangeEstart.length, rangeEend.location-(rangeEstart.location+rangeEstart.length))];NSLog(@"tmpMidStr :%@",tmpMidStr);//处理中间字符串[backStr appendString:[self convertOrgUnicodeToPrintUnicode:tmpMidStr]];//NSLog(@"backStr :%@",backStr);//获取[/e]之后的字符串 迭代NSString *tmpRightStr=[receiveString substringFromIndex:rangeEend.location+rangeEend.length];[backStr appendString:[self convertReceviceStringMaybeHasContainEmoji:tmpRightStr]];}else{//如果有[e]却找不到[/e] 直接返回空字符串 一般不会NSLog(@"emoji error:emojistring has no [/e]");return nil;}}else{[backStr appendString:receiveString];}NSLog(@"backStr is %@",backStr);return backStr;}

希望对大家有所帮组,,有写的不对的请大家指出。

同生天地间,为何我不能。

ios emoji 表情在 跨平台之间的发送 (二)、coding

相关文章:

你感兴趣的文章:

标签云: