作者:啊啊毛 | 来源:互联网 | 2023-06-27 18:34
脸色符的编码解码我之前在做微信小顺序的时刻遇到了一个题目,一些让用户输入的处所,另有用户的微信昵称都有能够输入键盘自带的emoji脸色符,在服务端吸收的时刻会有非常,在前端举行MD
脸色符的编码解码
我之前在做微信小顺序的时刻遇到了一个题目,一些让用户输入的处所,另有用户的微信昵称都有能够输入键盘自带的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);
});
}