JS emoji表情轉(zhuǎn)字符相關(guān)

1、判斷string對(duì)象是否emoji含有表情

function isEmojiCharacter(substring) {  
    for ( var i = 0; i < substring.length; i++) {  
        var hs = substring.charCodeAt(i);  
        if (0xd800 <= hs && hs <= 0xdbff) {  
            if (substring.length > 1) {  
                var ls = substring.charCodeAt(i + 1);  
                var uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;  
                if (0x1d000 <= uc && uc <= 0x1f77f) {  
                    return true;  
                }  
            }  
        } else if (substring.length > 1) {  
            var ls = substring.charCodeAt(i + 1);  
            if (ls == 0x20e3) {  
                return true;  
            }  
        } else {  
            if (0x2100 <= hs && hs <= 0x27ff) {  
                return true;  
            } else if (0x2B05 <= hs && hs <= 0x2b07) {  
                return true;  
            } else if (0x2934 <= hs && hs <= 0x2935) {  
                return true;  
            } else if (0x3297 <= hs && hs <= 0x3299) {  
                return true;  
            } else if (hs == 0xa9 || hs == 0xae || hs == 0x303d || hs == 0x3030  
                    || hs == 0x2b55 || hs == 0x2b1c || hs == 0x2b1b  
                    || hs == 0x2b50) {  
                return true;  
            }  
        }  
    }  
} 

注意:該方法不能識(shí)別輸入法中自動(dòng)填充的表情,會(huì)返回undefined ,比如
微信圖片_20220402164835.png

2、將string對(duì)象里的emoji表情轉(zhuǎn)換為字符

function emojiToStr(str) {
                //將表情轉(zhuǎn)換為字符
                var patt = /[\ud800-\udbff][\udc00-\udfff]/g; // 檢測(cè)utf16字符正則
                str = str.replace(patt, function(char) {
                    var H, L, code;
                    if (char.length === 2) {
                        H = char.charCodeAt(0); // 取出高位
                        L = char.charCodeAt(1); // 取出低位
                        code = (H - 0xD800) * 0x400 + 0x10000 + L - 0xDC00; // 轉(zhuǎn)換算法
                        return "&#" + code + ";";
                    } else {
                        return char;
                    }
                });
                return str;
            }

備注:該方法很好用,比如有時(shí)能確保需要處理的value值都是string的情況下,就可以不用判斷是否含有emoji表情,直接帶進(jìn)方法轉(zhuǎn)換就好了

3、將string對(duì)象里的emoji表情過(guò)濾掉

使用JS過(guò)濾emoji表情的主要原因:input標(biāo)簽中輸入emoji表情,提交表單后插入數(shù)據(jù)庫(kù)報(bào)錯(cuò)。
原因是因?yàn)閁TF-8編碼有可能是兩個(gè)、三個(gè)、四個(gè)字節(jié)。Emoji表情是4個(gè)字節(jié),而MySQL的utf8編碼最多3個(gè)字節(jié),所以數(shù)據(jù)插不進(jìn)去。
于是找到兩個(gè)解決方案:
1.將MySQL的編碼從utf8轉(zhuǎn)換成utf8mb4
2.前端JS校驗(yàn)過(guò)濾掉emoji表情

function filteremoji(){
    var ranges = [
        '\ud83c[\udf00-\udfff]', 
        '\ud83d[\udc00-\ude4f]', 
        '\ud83d[\ude80-\udeff]'
    ];
    var emojireg = $("#emoji_input").val();
    emojireg = emojireg .replace(new RegExp(ranges.join('|'), 'g'), ''));
}
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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