意外發(fā)現(xiàn)微信獲取的用戶名 帶有emoji 然后與后臺(tái)交互就出問(wèn)題了
emoji的問(wèn)題就是字符編碼超過(guò)了4位 導(dǎo)致后臺(tái)數(shù)據(jù)庫(kù)不支持 后臺(tái)試了下來(lái)說(shuō)出問(wèn)題的地方太多不能改 就只好前端過(guò)濾emoji了
因?yàn)槭撬奈痪幋a出問(wèn)題所以 就寫(xiě)了如下 把四位編碼的字符改為"?"的方法
+ (NSString *)filterMoreThanFourString:(NSString *)string {
string = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *newStr = @"";
for(int i =0; i < [string length]; ){
NSString *temp = nil;
for (int j = 1; j <= string.length - i; j++) {
temp = [string substringWithRange:NSMakeRange(i,j)];
temp = [temp stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
if (temp) {
i += j;
//? ? ? ? ? ? ? ? NSLog(@"占%d位的字符:%@",j,temp);
break;
}
}
//? ? ? ? NSLog(@"%d位最后的字是:%@",i,temp);
if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] > 3) {
temp = @"?";
}
newStr = [NSString stringWithFormat:@"%@%@",newStr,temp];
}
return newStr;
}
稍微改動(dòng)成 多位字符替換的成指定字符的方法:
#pragma mark? 過(guò)濾max位以上字符(不包括
+ (NSString *)filterMoreThanNumber:(NSInteger)maxNum String:(NSString *)string replaceString:(NSString *)replaceString UsingEncoding:(NSStringEncoding)usingEncoding{
string = [string stringByAddingPercentEscapesUsingEncoding:usingEncoding];
NSString *newStr = @"";
for(int i =0; i < [string length]; ){
NSString *temp = nil;
for (int j = 1; j <= string.length - i; j++) {
temp = [string substringWithRange:NSMakeRange(i,j)];
temp = [temp stringByReplacingPercentEscapesUsingEncoding:usingEncoding];
//只驗(yàn)證了NSUTF8StringEncoding 2017.04.01之前的編碼格式下 上一句如果獲取的字符不正常temp == nil
if (temp) {
i += j;
?NSLog(@"占%d位的字符:%@",j,temp);
break;
}
}
NSLog(@"%d位最后的字是:%@",i,temp);
if ([temp lengthOfBytesUsingEncoding:usingEncoding] > maxNum) {
temp = replaceString;
}
newStr = [NSString stringWithFormat:@"%@%@",newStr,temp];
}
return newStr;
}