iOS - 이모티콘 처리

4104 단어
네트워크 요청을 보낼 때 사용자가 이모티콘을 입력했기 때문에 서버에서 오류 알림 메시지를 되돌려줍니다.서버가 emoji 인코딩을 검증하지 못하는 문제를 해결하기 위해 로컬에서 emoji의 입력 제어를 해야 한다(일반적으로 서버가 데이터베이스에 emoji에 대응하는 디코딩 테이블을 추가하여 클라이언트가 emoji 표정을 보내는 것을 지원해야 한다).사용자가 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. 사용자가 입력한 문자열을 판단할 때 표정을 포함하여 대응하는 조작
+ (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바이트를 차지하고 중국어 인코딩은 3바이트를 차지한다. - (BOOL)textField: (UITextField*)textField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString*)string 방법에 따라string을 처리할 수 있다
  • NSUInteger stringUtf8Length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
    if(stringUtf8Length >= 4 && (stringUtf8Length / string.length != 3)) {
    return NO;
    }
    

    판단, 대부분의 이모티콘을 배출할 수 있고, 소량의 기호도 배제할 수 없다. 예를 들어_,세 글자를 차지한다.코드가 9궁격 키보드에 실용적이지 않아서 입력할 때 인터럽트 포인트에서 내용을 보거나 직접 출력% x로 볼 수 있습니다.

    좋은 웹페이지 즐겨찾기