附上uncode表情官方地址:https://unicode.org/emoji/charts/full-emoji-list.html#1f600
https://unicode.org/Public/emoji/13.0/emoji-sequences.txt
一个在JS中处理表情的库,提供的方法挺有用。但看了下还是和官方的少一些表情,不过库倒是经常更新
https://github.com/omnidan/node-emoji
/**
* 将表情转字符
* @param {}} str 表情字符
*/
export function utf16toEntities(str) {
var patt = /[\ud800-\udbff][\udc00-\udfff]/g; // 检测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; // 转换算法
return '&#' + code + ';';
} else {
return char;
}
});
return str;
}
/**
* 将字符转表情
* @param {*} str utf16态的表情编码
*/
export function uncodeUtf16(str) {
var reg = /\&#.*?;/g;
var result = str.replace(reg, function(char) {
var H, L, code;
if (char.length === 9) {
code = parseInt(char.match(/[0-9]+/g), 10);
H = Math.floor((code - 0x10000) / 0x400) + 0xd800;
L = ((code - 0x10000) % 0x400) + 0xdc00;
return unescape('%u' + H.toString(16) + '%u' + L.toString(16));
} else {
return char;
}
});
return result;
}
/**
* 是否为表情字符串
* @param {} substring 表情字符
*/
export function isEmojiCharacter(substring) {
for (var i = 0; i < substring.length; i++) {
var hs = substring.charCodeAt(i);
if (hs >= 0xd800 && hs <= 0xdbff) {
if (substring.length > 1) {
var ls = substring.charCodeAt(i + 1);
var uc = (hs - 0xd800) * 0x400 + (ls - 0xdc00) + 0x10000;
if (uc >= 0x1d000 && uc <= 0x1f77f) {
return true;
}
}
} else if (substring.length > 1) {
var ls = substring.charCodeAt(i + 1);
if (ls === 0x20e3) {
return true;
}
} else {
if (hs >= 0x2100 && hs <= 0x27ff) {
return true;
} else if (hs >= 0x2b05 && hs <= 0x2b07) {
return true;
} else if (hs >= 0x2934 && hs <= 0x2935) {
return true;
} else if (hs >= 0x3297 && hs <= 0x3299) {
return true;
} else if (
hs === 0xa9 ||
hs === 0xae ||
hs === 0x303d ||
hs === 0x3030 ||
hs === 0x2b55 ||
hs === 0x2b1c ||
hs === 0x2b1b ||
hs === 0x2b50
) {
return true;
}
}
}
return false;
}
export function stringToUtf8ByteArray(str) {
var out = [],
p = 0;
for (var i = 0; i < str.length; i++) {
var c = str.charCodeAt(i);
if (c < 128) {
out[p++] = c;
} else if (c < 2048) {
out[p++] = (c >> 6) | 192;
out[p++] = (c & 63) | 128;
} else if ((c & 0xfc00) == 0xd800 && i + 1 < str.length && (str.charCodeAt(i + 1) & 0xfc00) == 0xdc00) {
c = 0x10000 + ((c & 0x03ff) << 10) + (str.charCodeAt(++i) & 0x03ff);
out[p++] = (c >> 18) | 240;
out[p++] = ((c >> 12) & 63) | 128;
out[p++] = ((c >> 6) & 63) | 128;
out[p++] = (c & 63) | 128;
} else {
out[p++] = (c >> 12) | 224;
out[p++] = ((c >> 6) & 63) | 128;
out[p++] = (c & 63) | 128;
}
}
return out;
}
//bytes转换成字符串
export function utf8ByteArrayToString(bytes) {
var out = [],
pos = 0,
c = 0;
while (pos < bytes.length) {
var c1 = bytes[pos++];
if (c1 < 128) {
out[c++] = String.fromCharCode(c1);
} else if (c1 > 191 && c1 < 224) {
var c2 = bytes[pos++];
out[c++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
} else if (c1 > 239 && c1 < 365) {
var c2 = bytes[pos++];
var c3 = bytes[pos++];
var c4 = bytes[pos++];
var u = (((c1 & 7) << 18) | ((c2 & 63) << 12) | ((c3 & 63) << 6) | (c4 & 63)) - 0x10000;
out[c++] = String.fromCharCode(0xd800 + (u >> 10));
out[c++] = String.fromCharCode(0xdc00 + (u & 1023));
} else {
var c2 = bytes[pos++];
var c3 = bytes[pos++];
out[c++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
}
}
return out.join('');
}