微信小程序或者前端,輸入鍵盤自帶的emoji表情的編碼解碼

表情符的編碼解碼

我以前在作微信小程序的時候遇到了一個問題,一些讓用戶輸入的地方,還有用戶的微信暱稱都有可能輸入鍵盤自帶的emoji表情符,在服務端接收的時候會有異常,在前端進行MD5加密後的簽名和後端接收到數據後再進行MD5後的簽名不同。 前端

網上有給出一些解決方法,好比加載表情符圖片,修改數據庫的字符編碼等,這些方法都不太好,也沒有解決問題,後面找了比較久才找到合適的解決的方法:表情符編碼是十六進制的,須要把表情符轉碼成八進制的。算法

下面是我用到的代碼:數據庫

//把utf16的emoji表情字符進行轉碼成八進制的字符
function utf16toEntities(str) {
    var patt = /[\ud800-\udbff][\udc00-\udfff]/g; // 檢測utf16字符正則  
    return 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; // 轉換算法  
            return "&#" + code + ";";
        } else {
            return char;
        }
    });
}

//將編碼後的八進制的emoji表情從新解碼成十六進制的表情字符
function entitiesToUtf16(str) {
    return str.replace(/&#(\d+);/g, function (match, dec) {
        let H = Math.floor((dec - 0x10000) / 0x400) + 0xD800;
        let L = Math.floor(dec - 0x10000) % 0x400 + 0xDC00;
        return String.fromCharCode(H, L);
    });
}
相關文章
相關標籤/搜索