在發(fā)送網(wǎng)絡(luò)請(qǐng)求時(shí)簿煌,由于用戶輸入了emoji表情业舍,服務(wù)端返回錯(cuò)誤提示信息撤缴。為了解決服務(wù)器不能驗(yàn)證emoji編碼的問題劫扒,需要在本地進(jìn)行emoji的輸入控制(正常情況下應(yīng)該由服務(wù)器在數(shù)據(jù)庫(kù)中添加emoji對(duì)應(yīng)的轉(zhuǎn)碼表以支持客戶端發(fā)送emoji表情),在網(wǎng)上搜了下iOS端解決辦法如下:
1.當(dāng)用戶切換鍵盤為Emoji表情時(shí)荡陷,輸入的表情不響應(yīng)(即表情符號(hào)不顯示到UITextView或UITextField)雨效。這里可以通過UITextView或UITextField的回調(diào)和是否為emoji鍵盤:
[[[textView textInputMode] primaryLanguage] isEqualToString:@"emoji"]
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
//不支持系統(tǒng)表情的輸入
if ([[[UITextInputMode currentInputMode ]primaryLanguage] isEqualToString:@"emoji"]) {
return NO;
}
return YES;
}
2.通過過濾用戶輸入的emoji來(lái)實(shí)現(xiàn)
//過濾表情
+ (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.通過判斷用戶輸入的字符串時(shí)候含有表情來(lái)進(jìn)行對(duì)應(yīng)的操作
+ (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;
}
- emoji在NSUTF8StringEncoding編碼下占用4個(gè)字節(jié),中文編碼占用3個(gè)字節(jié),可以根據(jù)- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string方法亲善,把string做處理设易,依據(jù)
NSUInteger stringUtf8Length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
if(stringUtf8Length >= 4 && (stringUtf8Length / string.length != 3)) {
return NO;
}
判斷,可排出大多數(shù)表情符號(hào)逗柴,還有少量的符號(hào)排除不了蛹头,比如_ ,占3個(gè)字符戏溺。
代碼不實(shí)用在九宮格鍵盤上的渣蜗,可以在輸入時(shí)打斷點(diǎn)查看內(nèi)容或直接輸出%x查看。