iOS emoji表情轉(zhuǎn)碼 或者判斷

如果項(xiàng)目中有評(píng)論或者信息恢復(fù)的地方,往往會(huì)用到emoji,有時(shí)候如后臺(tái)不支持emoji,就會(huì)顯示亂碼錯(cuò)誤,我們可以把emoji轉(zhuǎn)成unicode編碼或者utf8編碼格式傳給服務(wù)器。當(dāng)然如果后臺(tái)服務(wù)器接收的時(shí)候能做好判斷識(shí)別最好,我們這邊后臺(tái)是支持的,我僅記錄一下方法,以備不時(shí)之需。

先定義一個(gè)UITextView 并設(shè)置代理

設(shè)定一個(gè)宏定義,用來(lái)判斷emoji

#defineMULITTHREEBYTEUTF16TOUNICODE(x,y) (((((x ^ 0xD800) << 2) | ((y ^ 0xDC00) >> 8)) << 8) | ((y ^ 0xDC00) & 0xFF)) + 0x10000

下面寫代理方法實(shí)現(xiàn)的內(nèi)容

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

{

NSString *hexstr = @"";

for (int i=0;i< [text length];i++)

{

hexstr = [hexstr stringByAppendingFormat:@"%@",[NSString stringWithFormat:@"0x%1X ",[text characterAtIndex:i]]];

}

NSLog(@"UTF16 [%@]",hexstr);

hexstr = @"";

long slen = strlen([text UTF8String]);

for (int i = 0; i < slen; i++)

{

//fffffff0 去除前面六個(gè)F & 0xFF

hexstr = [hexstr stringByAppendingFormat:@"%@",[NSString stringWithFormat:@"0x%X ",[text UTF8String][i] & 0xFF ]];

}

NSLog(@"UTF8 [%@]",hexstr);

hexstr = @"";

if ([text length] >= 2) {

for (int i = 0; i < [text length] / 2 && ([text length] % 2 == 0) ; i++)

{

// three bytes

if (([text characterAtIndex:i*2] & 0xFF00) == 0 ) {

hexstr = [hexstr stringByAppendingFormat:@"Ox%1X 0x%1X",[text characterAtIndex:i*2],[text characterAtIndex:i*2+1]];

}

else

{// four bytes

hexstr = [hexstr stringByAppendingFormat:@"U+%1X ",MULITTHREEBYTEUTF16TOUNICODE([text characterAtIndex:i*2],[text characterAtIndex:i*2+1])];

}

}

NSLog(@"(unicode) [%@]",hexstr);

}

else

{

NSLog(@"(unicode) U+%1X",[text characterAtIndex:0]);

}

return YES;

}


在輸入的時(shí)候,會(huì)自動(dòng)把輸入內(nèi)容轉(zhuǎn)成相應(yīng)的格式。

如果在有些地方不需要輸入emoji表情,可以做相關(guān)限制。

我這邊用到的是,如果用戶輸入emoji表情的時(shí)候,會(huì)給出提示

//是否含有表情

- (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;

}


通過(guò)調(diào)用該方法,如果返回的是YES則輸入內(nèi)容含有emoji,反之。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 如果項(xiàng)目中有評(píng)論或者信息恢復(fù)的地方,往往會(huì)用到emoji,有時(shí)候如后臺(tái)不支持emoji,就會(huì)顯示亂碼錯(cuò)誤,我們可以...
    華楠閱讀 1,687評(píng)論 0 0
  • UITextView/UITextField檢測(cè)并過(guò)濾Emoji表情符號(hào) 本人在開(kāi)發(fā)過(guò)程中遇到過(guò)這種情況,服務(wù)器端...
    蒲公英少年帶我飛閱讀 6,681評(píng)論 3 20
  • z在項(xiàng)目中,要求用戶評(píng)論超過(guò)10行或者超過(guò)400字節(jié)顯示“...read more”類似微信的展開(kāi)全文,這個(gè)功能已...
    zhanghengiOS閱讀 2,731評(píng)論 0 5
  • 也遇到很多的人,我不知道你會(huì)不會(huì)來(lái),會(huì)不會(huì)遇見(jiàn)我,你也是不是在等我這樣的人… 我已經(jīng)準(zhǔn)備好了,你可以慢...
    水平線閱讀 190評(píng)論 0 0
  • 那一年,他17歲,她15歲。 一個(gè)男孩,站在海邊,閉著雙眼,悠閑的吹著海風(fēng)在沙灘上拉小提琴。 有一天,男孩登QQ,...
    花默語(yǔ)閱讀 402評(píng)論 9 3

友情鏈接更多精彩內(nèi)容