welcome

emoji表情与unicode码互转

1.常见的emoji表情转换

表情转unicode

const str = '笑脸😋桃心❤🙏拜托💤睡觉😀😃😄😁'
const emojiReg = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/gi;
const emojiReg2 = /[\u{1f300}-\u{1f5ff}\u{1f900}-\u{1f9ff}\u{1f600}-\u{1f64f}\u{1f680}-\u{1f6ff}\u{2600}-\u{26ff}\u{2700}-\u{27bf}\u{1f1e6}-\u{1f1ff}\u{1f191}-\u{1f251}\u{1f004}\u{1f0cf}\u{1f170}-\u{1f171}\u{1f17e}-\u{1f17f}\u{1f18e}\u{3030}\u{2b50}\u{2b55}\u{2934}-\u{2935}\u{2b05}-\u{2b07}\u{2b1b}-\u{2b1c}\u{3297}\u{3299}\u{303d}\u{00a9}\u{00ae}\u{2122}\u{23f3}\u{24c2}\u{23e9}-\u{23ef}\u{25b6}\u{23f8}-\u{23fa}]/ug;
const strRes = str.replace(emojiReg, match => `[u+${match.codePointAt(0).toString(16)}]`)
console.log(strRes)

 

unicode转表情

export default function Name(v) {
  if(v) {
    let reg = v.match(/(\[u+[a-zA-z\+0-9].*?\])/gim)
    if(reg !== null){
      let str = v
      reg.map((item) => {
        let unicode = item.replace('[u+', '0x').replace(']', '');
        let emjo = String.fromCodePoint(unicode)
        str = str.replace(item, emjo)
      })
      return str
    } else {
      return v
    }
  } else {
    return v
  }
}

 

2.带键帽这类数字的emoji表情转换0️⃣3️⃣, 0⃣9⃣

将字符串中的 特殊emoji表情 转为 unicode码,例:0️⃣3️⃣, 0⃣9⃣这一类的emoji表情
function convertKeycapEmojiToUnicode(str) {
  // 匹配数字 + 可选变体选择符 + 键帽
  const regex = /\d(?:\uFE0F)?\u20E3/g;
  return str.replace(regex, (match) => {
    const number = match[0];                  // 第一个字符是数字
    const rest = match.slice(1);              // 剩余的字符(可能包含 FE0F 和 20E3)
    const convertedRest = Array.from(rest).map(ch => {
      const code = ch.codePointAt(0);
      return `[u+${code.toString(16).toUpperCase().padStart(4, '0')}]`;
    }).join('');
    // 如果 rest 为空则只返回 number,但此场景不会为空
    return convertedRest ? `${number}${convertedRest}` : number;
  });
}

 

将0️⃣3️⃣, 0⃣9⃣这一类的unicode码 转为 emoji表情

function revertKeycapUnicode(str) {
  // 匹配模式:数字 + 一个或多个 U+XXXX(没有空格)
  // 例如 0[u+FE0F][u+20E3]3[u+FE0F][u+20E3]0[u+20E3]9[u+20E3]
  const regex = /(\d)((?:\[u\+[0-9a-f]{4,5}\])+)/gi
  
  return str.replace(regex, (match, digit, codePointsStr) => {
    // 解析码点字符串,例如 " U+FE0F U+20E3" -> ["FE0F", "20E3"]
    const hexList = codePointsStr.trim().split(/\s+/).map(part => part.slice(2));
    // 将每个十六进制码点转换为对应字符
    const chars = hexList.map(hex => String.fromCodePoint(parseInt(hex, 16)));
    // 拼接:数字 + 转换后的字符序列(无空格)
    return digit + chars.join('');
  });
}

 

 

 

posted @ 2023-09-25 11:13  一首弦曲献仙音  阅读(460)  评论(0)    收藏  举报
//博文图片放大缩小 //飘桃花效果