NSString中的emoji单独处理
NSString中对emoji进行单独处理
作为emoji实际上的编码范围是在一定值中,我们可以找到这个范围来判定字符串中是否含有字符串
+ (NSString*)replaceEmoji:(NSString *)str {
__block NSMutableString* temp = [NSMutableString string];
[str enumerateSubstringsInRange:NSMakeRange(0, [str length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar hs = [substring characterAtIndex: 0];
// surrogate pair
if (0xd800 <= hs && hs <= 0xdbff) {const unichar ls = [substring characterAtIndex: 1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
//含有表情
}else {
//没有表情
}
} else {
if (0x2100 <= hs && hs <= 0x26ff) {
//含有表情
}else {
//没有表情
}
}
}];
NSLog(@"%@", temp);
return temp;
}
其次对于表情可以进行UTF-8的转码,服务器可以对这个UTF-8的进行保存
//通过这样可以对他进行了转码
+ (NSString *)sendOnjectReturnEMJString:(NSString *)obj
{
NSString *uniStr = [NSString stringWithUTF8String:[obj UTF8String]];
NSData *uniData = [uniStr dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *goodStr = [[NSString alloc] initWithData:uniData encoding:NSUTF8StringEncoding] ;
return goodStr;
}
单独处理字符串中的表情来对它用特殊字符包起来这样也就省去了解析数据的麻烦
+ (NSString*)replaceEmoji:(NSString *)str {
__block NSMutableString* temp = [NSMutableString string];
[str enumerateSubstringsInRange:NSMakeRange(0, [str length]) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar hs = [substring characterAtIndex: 0];
// surrogate pair
if (0xd800 <= hs && hs <= 0xdbff) {const unichar ls = [substring characterAtIndex: 1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
//对转码过后的编码利用^对表情编码前后抱起来
[temp appendString:[self sendOnjectReturnEMJString:[NSString stringWithFormat:@"^%@^", substring]]];
}else {
[temp appendString:substring];
}
} else {
if (0x2100 <= hs && hs <= 0x26ff) {
[temp appendString:[self sendOnjectReturnEMJString:[NSString stringWithFormat:@"^%@^", substring]]];
}else {
[temp appendString:substring];
}
}
}];
NSLog(@"%@", temp);
return temp;
}
最后就是我们对编码后字符串需要进行的解码的过程相对而言就比较简单了
+ (NSString *)sendEMJStringReturnstring:(NSString *)obj {
NSMutableString * returnStr = [[NSMutableString alloc] initWithCapacity:0];
NSArray * arr = [obj componentsSeparatedByString:@"^"];
for (int i = 0; i < arr.count; i ++) {
[returnStr appendString:[self chage:arr[i]]];
}
return returnStr;
}
+ (NSString *)chage:(NSString *)obj {
NSData *jsonData = [obj dataUsingEncoding:NSUTF8StringEncoding];
NSString *goodMsg1 = [[NSString alloc] initWithData:jsonData encoding:NSNonLossyASCIIStringEncoding];
if (goodMsg1 == nil ||[goodMsg1 isEqualToString:@""]) {
return obj;
}else {
return goodMsg1;
}
}
这样也就可以解析出字符串中单独的表情了;