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'), ''));
}