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


直接开始正题吧. 

如果转载 注明出处 http://blog.csdn.net/u011111270/article/details/39961565

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


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

ios emoji 表情在 跨平台之间的发送 (二)、coding_第1张图片



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)"];


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

1.1.1 转换为 utf8 

ios emoji 表情在 跨平台之间的发送 (二)、coding_第2张图片


1.1.2 utf8转换格式

ios emoji 表情在 跨平台之间的发送 (二)、coding_第3张图片

1.1.3 查询数据库

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

ios emoji 表情在 跨平台之间的发送 (二)、coding_第4张图片

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

到这里我们就完成了编码。


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;
}


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


你可能感兴趣的:(ios,objective-c)