最近項目中碰到的問題幻锁,在發(fā)送網絡請求時凯亮,由于用戶輸入了emoji表情,服務端返回錯誤提示信息哄尔。為了解決服務器不能驗證emoji編碼的問題假消,需要在本地進行emoji的輸入控制(正常情況下應該由服務器在數據庫中添加emoji對應的轉碼表以支持客戶端發(fā)送emoji表情),在網上搜了下iOS端解決辦法如下:
1.當用戶切換鍵盤為Emoji表情時岭接,輸入的表情不響應(即表情符號不顯示到UITextView或UITextField)置谦。這里可以通過UITextView或UITextField的回調和是否為emoji鍵盤:
[[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"]
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//不支持系統表情的輸入
if ([[[UITextInputMode currentInputMode ]primaryLanguage] isEqualToString:@"emoji"]) {
return NO;
}
return YES;
}
2.通過過濾用戶輸入的emoji來實現
//過濾表情
+ (NSString *)filterEmoji:(NSString *)string {
NSUInteger len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
const char *utf8 = [string UTF8String];
char *newUTF8 = malloc( sizeof(char) * len );
int j = 0;
//0xF0(4) 0xE2(3) 0xE3(3) 0xC2(2) 0x30---0x39(4)
for ( int i = 0; i < len; i++ ) {
unsigned int c = utf8;
BOOL isControlChar = NO;
if ( c == 4294967280 ||
c == 4294967089 ||
c == 4294967090 ||
c == 4294967091 ||
c == 4294967092 ||
c == 4294967093 ||
c == 4294967094 ||
c == 4294967095 ||
c == 4294967096 ||
c == 4294967097 ||
c == 4294967088 ) {
i = i + 3;
isControlChar = YES;
}
if ( c == 4294967266 || c == 4294967267 ) {
i = i + 2;
isControlChar = YES;
}
if ( c == 4294967234 ) {
i = i + 1;
isControlChar = YES;
}
if ( !isControlChar ) {
newUTF8[j] = utf8;
j++;
}
}
newUTF8[j] = '\0';
NSString *encrypted = [NSString stringWithCString:(const char*)newUTF8
encoding:NSUTF8StringEncoding];
free( newUTF8 );
return encrypted;
}
3.通過判斷用戶輸入的字符串時候含有表情來進行對應的操作
//是否含有表情
+ (BOOL)stringContainsEmoji:(NSString *)string
{
__block BOOL returnValue = NO;
[string enumerateSubstringsInRange:NSMakeRange(0, [string length])
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
const unichar hs = [substring characterAtIndex:0];
if (0xd800 <= hs && hs <= 0xdbff) {
if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
const int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
returnValue = YES;
}
}
} else if (substring.length > 1) {
const unichar ls = [substring characterAtIndex:1];
if (ls == 0x20e3) {
returnValue = YES;
}
} else {
if (0x2100 <= hs && hs <= 0x27ff) {
returnValue = YES;
} else if (0x2B05 <= hs && hs <= 0x2b07) {
returnValue = YES;
} else if (0x2934 <= hs && hs <= 0x2935) {
returnValue = YES;
} else if (0x3297 <= hs && hs <= 0x3299) {
returnValue = YES;
} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b || hs == 0x2b50) {
returnValue = YES;
}
}
}];
return returnValue;
}