js转码与解码emoji

javascript正常的英文编码是utf-8的,mysql默认存的也是这种编码,而emoji表情是utf-16的,这就导致了db存储emoji会有问题,所以最好的方式是,把emoji先转成utf-8的这种实体编码,存到数据库里,要使用的时候,从db拿出来,再解码成utf-16的形式。

{ // 表情转码 utf16toEntities(str) { const patt = /[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则 str = str.replace(patt, (char) => { let H; let L; let code; let s; if (char.length === 2) { H = char.charCodeAt(0); // 取出高位 L = char.charCodeAt(1); // 取出低位 code = (H - 0xD800) * 0x400 + 0x10000 + L - 0xDC00; // 转换算法 s = `&#${code};`; } else { s = char; } return s; }); return str; }, // 表情解码 entitiestoUtf16(strObj) { const patt = /&#\d+;/g; const arr = strObj.match(patt) || []; let H; let L; let code; for (let i = 0; i < arr.length; i += 1) { code = arr[i]; code = code.replace('&#', '').replace(';', ''); // 高位 H = Math.floor((code - 0x10000) / 0x400) + 0xD800; // 低位 L = ((code - 0x10000) % 0x400) + 0xDC00; code = `&#${code};`; const s = String.fromCharCode(H, L); strObj = strObj.replace(code, s); } return strObj; } }

使用示例

const s = 'test emoji

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgfx.html