直接开始正题吧.
如果转载 注明出处 http://blog.youkuaiyun.com/u011111270/article/details/39961565
将一个 emoji的表情 转换为 [e]U+1F604[/e]
一个分两个大的步骤 发送时候的编码 和 接收时候的解码
1.编码
1.1 表情转换为[e]U+1F604[/e]
[_dbexecuteUpdate:@"INSERT INTO SEmoji VALUES (1,'U+1F604','0xF0 0x9F 0x98 0x84','0xD83D 0xDE04','E415','smiles_01_01.png',NULL)"];
1.1.1 转换为 utf8
1.1.2 utf8转换格式
1.1.3 查询数据库
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 ;// 变成utf32
inputChar = 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.先把之前的赋值到 backstr
NSLog(@"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;
}
希望对大家有所帮组,有写的不对的请大家指出。