链接文本— title: “【山竹记账前端-vue】11.自定义表单组件-封装 EmojiSelect 组件” date: 2026-10-12T22:20:43+08:00 draft: false tags: [“FrontEnd”] tags_weight: 100 categories: [“FrontEnd”] categoryes_weight: 100

isCJKLanguage: true

【山竹记账前端-vue】11.自定义表单组件-封装 EmojiSelect 组件


大纲链接 §

[toc]


1. 选看:用 JS 爬取页面信息 ⇧

从最新的 Full Emoji List, v18.0 网站爬取unicode图标信息

  • 需要构造一个类型,并保持抓取的顺序(不能使用哈希对象,会按照 ASCII 码重新排列) type EmojiListType = [string, string[]][]

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    // 所有图标在一个大table中
    document.querySelectorAll('table')
    // 行数 2185
    document.querySelectorAll('table')[0].querySelectorAll('tr').length
    // 遍历返回 NodeList
    const trArray = Array.from(document.querySelectorAll('table')[0].querySelectorAll('tr'))
    const result = []
    trArray.forEach(tr => {
    const firstChild = tr.children[0]
    const secondChild = tr.children[1]
    // 分类名称 中表头
    if(firstChild.classList.contains('mediumhead')) {
    console.log('分类')
    result.push([firstChild.textContent])
    }
    // 字符类型表头栏,需要取出 Code 即第二栏的文字符号
    else if(firstChild.classList.contains('rchars')) {
    // 表头-无操作
    if(firstChild.tagName.toLowerCase() === 'th') {console.log('表头')}
    else {
      // 表内容-将自身推入第一项(名称字符串),并在第二项初始化或推入数据
      const last = result[result.length - 1]
      last[1] = last[1] || []
      last[1].push(secondChild.textContent)
      console.log('数据', secondChild.textContent)
    }
    }
    })
    
  • 可得到一个有顺序并含有分类名称的颜文字数据列表

  • 序列化 JSON.stringify(result)

  • 将类似 "U+1F600" 字符使用正则匹配 U\+([0-9A-F]{4,5}) 捕获替换为 \\u{$1}

  • 搜索并去除 "\u{1F1F9} \u{1F1FC}"

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    
    export type EmojiListType = [string, string[]][]
    
    // @ts-nocheck
    /**
    * @Description: 颜文字列表
    * @Author: xmasuhai <xmasuhai@163.com>
    * @Date: 2026-10-17 14:15:43
    * @LastEditors: xmasuhai <xmasuhai@163.com>
    * @LastEditTime: 2026-10-18 17:23:44
    * @FilePath: content/post/山竹记账/【山竹记账前端-vue】11.自定义表单组件-封装 EmojiSelect 组件.md
    */
    export const safeEmojiList: Readonly<EmojiListType> = Object.freeze([
    ["face-smiling", ["\u{1F600}","\u{1F603}","\u{1F604}","\u{1F601}","\u{1F606}","\u{1F605}","\u{1F923}","\u{1F602}","\u{1F642}","\u{1F643}","\u{1FAE0}","\u{1FAEB}","\u{1F609}","\u{1F60A}","\u{1F607}"]],
    ["face-affection", ["\u{1F970}","\u{1F60D}","\u{1F929}","\u{1F618}","\u{1F617}","\u{263A}","\u{1F61A}","\u{1F619}","\u{1F972}"]],
    ["face-tongue", ["\u{1F60B}","\u{1F61B}","\u{1F61C}","\u{1F92A}","\u{1F61D}","\u{1F911}"]],
    ["face-hand", ["\u{1F917}","\u{1F92D}","\u{1FAE2}","\u{1FAE3}","\u{1F92B}","\u{1F914}","\u{1FAE1}"]],
    ["face-neutral-skeptical",["\u{1F910}","\u{1F928}","\u{1F610}","\u{1F611}","\u{1F636}","\u{1FAE5}","\u{1F636} \u{200D} \u{1F32B} \u{FE0F}","\u{1F60F}","\u{1F612}","\u{1F644}","\u{1F62C}","\u{1F62E} \u{200D} \u{1F4A8}","\u{1F925}","\u{1FAE8}","\u{1F642} \u{200D} \u{2194} \u{FE0F}","\u{1F642} \u{200D} \u{2195} \u{FE0F}"]],
    ["face-sleepy", ["\u{1F60C}","\u{1F614}","\u{1F62A}","\u{1F924}","\u{1F634}","\u{1FAE9}"]],
    ["face-unwell", ["\u{1F637}","\u{1F912}","\u{1F915}","\u{1F922}","\u{1F92E}","\u{1F927}","\u{1F975}","\u{1F976}","\u{1F974}","\u{1F635}","\u{1F635} \u{200D} \u{1F4AB}","\u{1F92F}"]],
    ["face-hat", ["\u{1F920}","\u{1F973}","\u{1F978}"]],
    ["face-glasses", ["\u{1F60E}","\u{1F913}","\u{1F9D0}"]],
    ["face-concerned", ["\u{1F615}","\u{1FAE4}","\u{1F61F}","\u{1F641}","\u{2639}","\u{1F62E}","\u{1F62F}","\u{1F632}","\u{1F633}","\u{1FAEA}","\u{1F97A}","\u{1F979}","\u{1F626}","\u{1F627}","\u{1F628}","\u{1F630}","\u{1F625}","\u{1F622}","\u{1F62D}","\u{1F631}","\u{1F616}","\u{1F623}","\u{1F61E}","\u{1F613}","\u{1F629}","\u{1F62B}","\u{1F971}"]],
    ["face-negative", ["\u{1F624}","\u{1F621}","\u{1F620}","\u{1F92C}","\u{1F608}","\u{1F47F}","\u{1F480}","\u{2620}"]],
    ["face-costume", ["\u{1F4A9}","\u{1F921}","\u{1F479}","\u{1F47A}","\u{1F47B}","\u{1F47D}","\u{1F47E}","\u{1F916}"]],
    ["cat-face", ["\u{1F63A}","\u{1F638}","\u{1F639}","\u{1F63B}","\u{1F63C}","\u{1F63D}","\u{1F640}","\u{1F63F}","\u{1F63E}"]],
    ["monkey-face", ["\u{1F648}","\u{1F649}","\u{1F64A}"]],
    ["heart", ["\u{1F48C}","\u{1F498}","\u{1F49D}","\u{1F496}","\u{1F497}","\u{1F493}","\u{1F49E}","\u{1F495}","\u{1F49F}","\u{2763}","\u{1F494}","\u{2764} \u{FE0F} \u{200D} \u{1F525}","\u{2764} \u{FE0F} \u{200D} \u{1FA79}","\u{2764}","\u{1FA77}","\u{1F9E1}","\u{1F49B}","\u{1F49A}","\u{1F499}","\u{1FA75}","\u{1F49C}","\u{1F90E}","\u{1F5A4}","\u{1FA76}","\u{1F90D}"]],
    ["emotion", ["\u{1F48B}","\u{1F4AF}","\u{1F4A2}","\u{1FAEF}","\u{1F4A5}","\u{1F4AB}","\u{1F4A6}","\u{1F4A8}","\u{1F573}","\u{1F4AC}","\u{1F441} \u{FE0F} \u{200D} \u{1F5E8} \u{FE0F}","\u{1F5E8}","\u{1F5EF}","\u{1F4AD}","\u{1F4A4}"]],
    ["hand-fingers-open", ["\u{1F44B}","\u{1F91A}","\u{1F590}","\u{270B}","\u{1F596}","\u{1FAF1}","\u{1FAF2}","\u{1FAF3}","\u{1FAF4}","\u{1FAF7}","\u{1FAF8}"]],
    ["hand-fingers-partial", ["\u{1F44C}","\u{1F90C}","\u{1F90F}","\u{270C}","\u{1F91E}","\u{1FAF0}","\u{1F91F}","\u{1F918}","\u{1F919}"]],
    ["hand-single-finger", ["\u{1F448}","\u{1F449}","\u{1F446}","\u{1F595}","\u{1F447}","\u{261D}","\u{1FAF5}"]],
    ["hand-fingers-closed", ["\u{1F44D}","\u{1F44E}","\u{1FAF9}","\u{1FAFA}","\u{270A}","\u{1F44A}","\u{1F91B}","\u{1F91C}"]],
    ["hands", ["\u{1F44F}","\u{1F64C}","\u{1FAF6}","\u{1F450}","\u{1F932}","\u{1F91D}","\u{1F64F}"]],
    ["hand-prop", ["\u{270D}","\u{1F485}","\u{1F933}"]],
    ["body-parts", ["\u{1F4AA}","\u{1F9BE}","\u{1F9BF}","\u{1F9B5}","\u{1F9B6}","\u{1F442}","\u{1F9BB}","\u{1F443}","\u{1F9E0}","\u{1FAC0}","\u{1FAC1}","\u{1F9B7}","\u{1F9B4}","\u{1F440}","\u{1F441}","\u{1F445}","\u{1F444}","\u{1FAE6}"]],
    ["person", ["\u{1F476}","\u{1F9D2}","\u{1F466}","\u{1F467}","\u{1F9D1}","\u{1F471}","\u{1F468}","\u{1F9D4}","\u{1F9D4} \u{200D} \u{2642} \u{FE0F}","\u{1F9D4} \u{200D} \u{2640} \u{FE0F}","\u{1F468} \u{200D} \u{1F9B0}","\u{1F468} \u{200D} \u{1F9B1}","\u{1F468} \u{200D} \u{1F9B3}","\u{1F468} \u{200D} \u{1F9B2}","\u{1F469}","\u{1F469} \u{200D} \u{1F9B0}","\u{1F9D1} \u{200D} \u{1F9B0}","\u{1F469} \u{200D} \u{1F9B1}","\u{1F9D1} \u{200D} \u{1F9B1}","\u{1F469} \u{200D} \u{1F9B3}","\u{1F9D1} \u{200D} \u{1F9B3}","\u{1F469} \u{200D} \u{1F9B2}","\u{1F9D1} \u{200D} \u{1F9B2}","\u{1F471} \u{200D} \u{2640} \u{FE0F}","\u{1F471} \u{200D} \u{2642} \u{FE0F}","\u{1F9D3}","\u{1F474}","\u{1F475}"]],
    ["person-gesture", ["\u{1F64D}","\u{1F64D} \u{200D} \u{2642} \u{FE0F}","\u{1F64D} \u{200D} \u{2640} \u{FE0F}","\u{1F64E}","\u{1F64E} \u{200D} \u{2642} \u{FE0F}","\u{1F64E} \u{200D} \u{2640} \u{FE0F}","\u{1F645}","\u{1F645} \u{200D} \u{2642} \u{FE0F}","\u{1F645} \u{200D} \u{2640} \u{FE0F}","\u{1F646}","\u{1F646} \u{200D} \u{2642} \u{FE0F}","\u{1F646} \u{200D} \u{2640} \u{FE0F}","\u{1F481}","\u{1F481} \u{200D} \u{2642} \u{FE0F}","\u{1F481} \u{200D} \u{2640} \u{FE0F}","\u{1F64B}","\u{1F64B} \u{200D} \u{2642} \u{FE0F}","\u{1F64B} \u{200D} \u{2640} \u{FE0F}","\u{1F9CF}","\u{1F9CF} \u{200D} \u{2642} \u{FE0F}","\u{1F9CF} \u{200D} \u{2640} \u{FE0F}","\u{1F647}","\u{1F647} \u{200D} \u{2642} \u{FE0F}","\u{1F647} \u{200D} \u{2640} \u{FE0F}","\u{1F926}","\u{1F926} \u{200D} \u{2642} \u{FE0F}","\u{1F926} \u{200D} \u{2640} \u{FE0F}","\u{1F937}","\u{1F937} \u{200D} \u{2642} \u{FE0F}","\u{1F937} \u{200D} \u{2640} \u{FE0F}"]],
    ["person-role", ["\u{1F9D1} \u{200D} \u{2695} \u{FE0F}","\u{1F468} \u{200D} \u{2695} \u{FE0F}","\u{1F469} \u{200D} \u{2695} \u{FE0F}","\u{1F9D1} \u{200D} \u{1F393}","\u{1F468} \u{200D} \u{1F393}","\u{1F469} \u{200D} \u{1F393}","\u{1F9D1} \u{200D} \u{1F3EB}","\u{1F468} \u{200D} \u{1F3EB}","\u{1F469} \u{200D} \u{1F3EB}","\u{1F9D1} \u{200D} \u{2696} \u{FE0F}","\u{1F468} \u{200D} \u{2696} \u{FE0F}","\u{1F469} \u{200D} \u{2696} \u{FE0F}","\u{1F9D1} \u{200D} \u{1F33E}","\u{1F468} \u{200D} \u{1F33E}","\u{1F469} \u{200D} \u{1F33E}","\u{1F9D1} \u{200D} \u{1F373}","\u{1F468} \u{200D} \u{1F373}","\u{1F469} \u{200D} \u{1F373}","\u{1F9D1} \u{200D} \u{1F527}","\u{1F468} \u{200D} \u{1F527}","\u{1F469} \u{200D} \u{1F527}","\u{1F9D1} \u{200D} \u{1F3ED}","\u{1F468} \u{200D} \u{1F3ED}","\u{1F469} \u{200D} \u{1F3ED}","\u{1F9D1} \u{200D} \u{1F4BC}","\u{1F468} \u{200D} \u{1F4BC}","\u{1F469} \u{200D} \u{1F4BC}","\u{1F9D1} \u{200D} \u{1F52C}","\u{1F468} \u{200D} \u{1F52C}","\u{1F469} \u{200D} \u{1F52C}","\u{1F9D1} \u{200D} \u{1F4BB}","\u{1F468} \u{200D} \u{1F4BB}","\u{1F469} \u{200D} \u{1F4BB}","\u{1F9D1} \u{200D} \u{1F3A4}","\u{1F468} \u{200D} \u{1F3A4}","\u{1F469} \u{200D} \u{1F3A4}","\u{1F9D1} \u{200D} \u{1F3A8}","\u{1F468} \u{200D} \u{1F3A8}","\u{1F469} \u{200D} \u{1F3A8}","\u{1F9D1} \u{200D} \u{2708} \u{FE0F}","\u{1F468} \u{200D} \u{2708} \u{FE0F}","\u{1F469} \u{200D} \u{2708} \u{FE0F}","\u{1F9D1} \u{200D} \u{1F680}","\u{1F468} \u{200D} \u{1F680}","\u{1F469} \u{200D} \u{1F680}","\u{1F9D1} \u{200D} \u{1F692}","\u{1F468} \u{200D} \u{1F692}","\u{1F469} \u{200D} \u{1F692}","\u{1F46E}","\u{1F46E} \u{200D} \u{2642} \u{FE0F}","\u{1F46E} \u{200D} \u{2640} \u{FE0F}","\u{1F575}","\u{1F575} \u{FE0F} \u{200D} \u{2642} \u{FE0F}","\u{1F575} \u{FE0F} \u{200D} \u{2640} \u{FE0F}","\u{1F482}","\u{1F482} \u{200D} \u{2642} \u{FE0F}","\u{1F482} \u{200D} \u{2640} \u{FE0F}","\u{1F977}","\u{1F477}","\u{1F477} \u{200D} \u{2642} \u{FE0F}","\u{1F477} \u{200D} \u{2640} \u{FE0F}","\u{1FAC5}","\u{1F934}","\u{1F478}","\u{1F473}","\u{1F473} \u{200D} \u{2642} \u{FE0F}","\u{1F473} \u{200D} \u{2640} \u{FE0F}","\u{1F472}","\u{1F9D5}","\u{1F935}","\u{1F935} \u{200D} \u{2642} \u{FE0F}","\u{1F935} \u{200D} \u{2640} \u{FE0F}","\u{1F470}","\u{1F470} \u{200D} \u{2642} \u{FE0F}","\u{1F470} \u{200D} \u{2640} \u{FE0F}","\u{1F930}","\u{1FAC3}","\u{1FAC4}","\u{1F931}","\u{1F469} \u{200D} \u{1F37C}","\u{1F468} \u{200D} \u{1F37C}","\u{1F9D1} \u{200D} \u{1F37C}"]],
    ["person-fantasy", ["\u{1F47C}","\u{1F385}","\u{1F936}","\u{1F9D1} \u{200D} \u{1F384}","\u{1F9B8}","\u{1F9B8} \u{200D} \u{2642} \u{FE0F}","\u{1F9B8} \u{200D} \u{2640} \u{FE0F}","\u{1F9B9}","\u{1F9B9} \u{200D} \u{2642} \u{FE0F}","\u{1F9B9} \u{200D} \u{2640} \u{FE0F}","\u{1F9D9}","\u{1F9D9} \u{200D} \u{2642} \u{FE0F}","\u{1F9D9} \u{200D} \u{2640} \u{FE0F}","\u{1F9DA}","\u{1F9DA} \u{200D} \u{2642} \u{FE0F}","\u{1F9DA} \u{200D} \u{2640} \u{FE0F}","\u{1F9DB}","\u{1F9DB} \u{200D} \u{2642} \u{FE0F}","\u{1F9DB} \u{200D} \u{2640} \u{FE0F}","\u{1F9DC}","\u{1F9DC} \u{200D} \u{2642} \u{FE0F}","\u{1F9DC} \u{200D} \u{2640} \u{FE0F}","\u{1F9DD}","\u{1F9DD} \u{200D} \u{2642} \u{FE0F}","\u{1F9DD} \u{200D} \u{2640} \u{FE0F}","\u{1F9DE}","\u{1F9DE} \u{200D} \u{2642} \u{FE0F}","\u{1F9DE} \u{200D} \u{2640} \u{FE0F}","\u{1F9DF}","\u{1F9DF} \u{200D} \u{2642} \u{FE0F}","\u{1F9DF} \u{200D} \u{2640} \u{FE0F}","\u{1F9CC}","\u{1FAC8}"]],
    ["person-activity", ["\u{1F486}","\u{1F486} \u{200D} \u{2642} \u{FE0F}","\u{1F486} \u{200D} \u{2640} \u{FE0F}","\u{1F487}","\u{1F487} \u{200D} \u{2642} \u{FE0F}","\u{1F487} \u{200D} \u{2640} \u{FE0F}","\u{1F6B6}","\u{1F6B6} \u{200D} \u{2642} \u{FE0F}","\u{1F6B6} \u{200D} \u{2640} \u{FE0F}","\u{1F6B6} \u{200D} \u{27A1} \u{FE0F}","\u{1F6B6} \u{200D} \u{2640} \u{FE0F} \u{200D} \u{27A1} \u{FE0F}","\u{1F6B6} \u{200D} \u{2642} \u{FE0F} \u{200D} \u{27A1} \u{FE0F}","\u{1F9CD}","\u{1F9CD} \u{200D} \u{2642} \u{FE0F}","\u{1F9CD} \u{200D} \u{2640} \u{FE0F}","\u{1F9CE}","\u{1F9CE} \u{200D} \u{2642} \u{FE0F}","\u{1F9CE} \u{200D} \u{2640} \u{FE0F}","\u{1F9CE} \u{200D} \u{27A1} \u{FE0F}","\u{1F9CE} \u{200D} \u{2640} \u{FE0F} \u{200D} \u{27A1} \u{FE0F}","\u{1F9CE} \u{200D} \u{2642} \u{FE0F} \u{200D} \u{27A1} \u{FE0F}","\u{1F9D1} \u{200D} \u{1F9AF}","\u{1F9D1} \u{200D} \u{1F9AF} \u{200D} \u{27A1} \u{FE0F}","\u{1F468} \u{200D} \u{1F9AF}","\u{1F468} \u{200D} \u{1F9AF} \u{200D} \u{27A1} \u{FE0F}","\u{1F469} \u{200D} \u{1F9AF}","\u{1F469} \u{200D} \u{1F9AF} \u{200D} \u{27A1} \u{FE0F}","\u{1F9D1} \u{200D} \u{1F9BC}","\u{1F9D1} \u{200D} \u{1F9BC} \u{200D} \u{27A1} \u{FE0F}","\u{1F468} \u{200D} \u{1F9BC}","\u{1F468} \u{200D} \u{1F9BC} \u{200D} \u{27A1} \u{FE0F}","\u{1F469} \u{200D} \u{1F9BC}","\u{1F469} \u{200D} \u{1F9BC} \u{200D} \u{27A1} \u{FE0F}","\u{1F9D1} \u{200D} \u{1F9BD}","\u{1F9D1} \u{200D} \u{1F9BD} \u{200D} \u{27A1} \u{FE0F}","\u{1F468} \u{200D} \u{1F9BD}","\u{1F468} \u{200D} \u{1F9BD} \u{200D} \u{27A1} \u{FE0F}","\u{1F469} \u{200D} \u{1F9BD}","\u{1F469} \u{200D} \u{1F9BD} \u{200D} \u{27A1} \u{FE0F}","\u{1F3C3}","\u{1F3C3} \u{200D} \u{2642} \u{FE0F}","\u{1F3C3} \u{200D} \u{2640} \u{FE0F}","\u{1F3C3} \u{200D} \u{27A1} \u{FE0F}","\u{1F3C3} \u{200D} \u{2640} \u{FE0F} \u{200D} \u{27A1} \u{FE0F}","\u{1F3C3} \u{200D} \u{2642} \u{FE0F} \u{200D} \u{27A1} \u{FE0F}","\u{1F9D1} \u{200D} \u{1FA70}","\u{1F483}","\u{1F57A}","\u{1F574}","\u{1F46F}","\u{1F46F} \u{200D} \u{2642} \u{FE0F}","\u{1F46F} \u{200D} \u{2640} \u{FE0F}","\u{1F9D6}","\u{1F9D6} \u{200D} \u{2642} \u{FE0F}","\u{1F9D6} \u{200D} \u{2640} \u{FE0F}","\u{1F9D7}","\u{1F9D7} \u{200D} \u{2642} \u{FE0F}","\u{1F9D7} \u{200D} \u{2640} \u{FE0F}"]],
    ["person-sport", ["\u{1F93A}","\u{1F3C7}","\u{26F7}","\u{1F3C2}","\u{1F3CC}","\u{1F3CC} \u{FE0F} \u{200D} \u{2642} \u{FE0F}","\u{1F3CC} \u{FE0F} \u{200D} \u{2640} \u{FE0F}","\u{1F3C4}","\u{1F3C4} \u{200D} \u{2642} \u{FE0F}","\u{1F3C4} \u{200D} \u{2640} \u{FE0F}","\u{1F6A3}","\u{1F6A3} \u{200D} \u{2642} \u{FE0F}","\u{1F6A3} \u{200D} \u{2640} \u{FE0F}","\u{1F3CA}","\u{1F3CA} \u{200D} \u{2642} \u{FE0F}","\u{1F3CA} \u{200D} \u{2640} \u{FE0F}","\u{26F9}","\u{26F9} \u{FE0F} \u{200D} \u{2642} \u{FE0F}","\u{26F9} \u{FE0F} \u{200D} \u{2640} \u{FE0F}","\u{1F3CB}","\u{1F3CB} \u{FE0F} \u{200D} \u{2642} \u{FE0F}","\u{1F3CB} \u{FE0F} \u{200D} \u{2640} \u{FE0F}","\u{1F6B4}","\u{1F6B4} \u{200D} \u{2642} \u{FE0F}","\u{1F6B4} \u{200D} \u{2640} \u{FE0F}","\u{1F6B5}","\u{1F6B5} \u{200D} \u{2642} \u{FE0F}","\u{1F6B5} \u{200D} \u{2640} \u{FE0F}","\u{1F938}","\u{1F938} \u{200D} \u{2642} \u{FE0F}","\u{1F938} \u{200D} \u{2640} \u{FE0F}","\u{1F93C}","\u{1F93C} \u{200D} \u{2642} \u{FE0F}","\u{1F93C} \u{200D} \u{2640} \u{FE0F}","\u{1F93D}","\u{1F93D} \u{200D} \u{2642} \u{FE0F}","\u{1F93D} \u{200D} \u{2640} \u{FE0F}","\u{1F93E}","\u{1F93E} \u{200D} \u{2642} \u{FE0F}","\u{1F93E} \u{200D} \u{2640} \u{FE0F}","\u{1F939}","\u{1F939} \u{200D} \u{2642} \u{FE0F}","\u{1F939} \u{200D} \u{2640} \u{FE0F}"]],
    ["person-resting", ["\u{1F9D8}","\u{1F9D8} \u{200D} \u{2642} \u{FE0F}","\u{1F9D8} \u{200D} \u{2640} \u{FE0F}","\u{1F6C0}","\u{1F6CC}"]],
    ["family", ["\u{1F9D1} \u{200D} \u{1F91D} \u{200D} \u{1F9D1}","\u{1F46D}","\u{1F46B}","\u{1F46C}","\u{1F48F}","\u{1F469} \u{200D} \u{2764} \u{FE0F} \u{200D} \u{1F48B} \u{200D} \u{1F468}","\u{1F468} \u{200D} \u{2764} \u{FE0F} \u{200D} \u{1F48B} \u{200D} \u{1F468}","\u{1F469} \u{200D} \u{2764} \u{FE0F} \u{200D} \u{1F48B} \u{200D} \u{1F469}","\u{1F491}","\u{1F469} \u{200D} \u{2764} \u{FE0F} \u{200D} \u{1F468}","\u{1F468} \u{200D} \u{2764} \u{FE0F} \u{200D} \u{1F468}","\u{1F469} \u{200D} \u{2764} \u{FE0F} \u{200D} \u{1F469}","\u{1F468} \u{200D} \u{1F469} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F469} \u{200D} \u{1F467}","\u{1F468} \u{200D} \u{1F469} \u{200D} \u{1F467} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F469} \u{200D} \u{1F466} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F469} \u{200D} \u{1F467} \u{200D} \u{1F467}","\u{1F468} \u{200D} \u{1F468} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F468} \u{200D} \u{1F467}","\u{1F468} \u{200D} \u{1F468} \u{200D} \u{1F467} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F468} \u{200D} \u{1F466} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F468} \u{200D} \u{1F467} \u{200D} \u{1F467}","\u{1F469} \u{200D} \u{1F469} \u{200D} \u{1F466}","\u{1F469} \u{200D} \u{1F469} \u{200D} \u{1F467}","\u{1F469} \u{200D} \u{1F469} \u{200D} \u{1F467} \u{200D} \u{1F466}","\u{1F469} \u{200D} \u{1F469} \u{200D} \u{1F466} \u{200D} \u{1F466}","\u{1F469} \u{200D} \u{1F469} \u{200D} \u{1F467} \u{200D} \u{1F467}","\u{1F468} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F466} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F467}","\u{1F468} \u{200D} \u{1F467} \u{200D} \u{1F466}","\u{1F468} \u{200D} \u{1F467} \u{200D} \u{1F467}","\u{1F469} \u{200D} \u{1F466}","\u{1F469} \u{200D} \u{1F466} \u{200D} \u{1F466}","\u{1F469} \u{200D} \u{1F467}","\u{1F469} \u{200D} \u{1F467} \u{200D} \u{1F466}","\u{1F469} \u{200D} \u{1F467} \u{200D} \u{1F467}"]],
    ["person-symbol", ["\u{1F5E3}","\u{1F464}","\u{1F465}","\u{1FAC2}","\u{1F46A}","\u{1F9D1} \u{200D} \u{1F9D1} \u{200D} \u{1F9D2}","\u{1F9D1} \u{200D} \u{1F9D1} \u{200D} \u{1F9D2} \u{200D} \u{1F9D2}","\u{1F9D1} \u{200D} \u{1F9D2}","\u{1F9D1} \u{200D} \u{1F9D2} \u{200D} \u{1F9D2}","\u{1F463}","\u{1FAC6}"]],
    ["hair-style", ["\u{1F9B0}","\u{1F9B1}","\u{1F9B3}","\u{1F9B2}"]],
    ["animal-mammal", ["\u{1F435}","\u{1F412}","\u{1F98D}","\u{1F9A7}","\u{1F436}","\u{1F415}","\u{1F9AE}","\u{1F415} \u{200D} \u{1F9BA}","\u{1F429}","\u{1F43A}","\u{1F98A}","\u{1F99D}","\u{1F431}","\u{1F408}","\u{1F408} \u{200D} \u{2B1B}","\u{1F981}","\u{1F42F}","\u{1F405}","\u{1F406}","\u{1F434}","\u{1FACE}","\u{1FACF}","\u{1F40E}","\u{1F984}","\u{1F993}","\u{1F98C}","\u{1F9AC}","\u{1F42E}","\u{1F402}","\u{1F403}","\u{1F404}","\u{1F437}","\u{1F416}","\u{1F417}","\u{1F43D}","\u{1F40F}","\u{1F411}","\u{1F410}","\u{1F42A}","\u{1F42B}","\u{1F999}","\u{1F992}","\u{1F418}","\u{1F9A3}","\u{1F98F}","\u{1F99B}","\u{1F42D}","\u{1F401}","\u{1F400}","\u{1F439}","\u{1F430}","\u{1F407}","\u{1F43F}","\u{1F9AB}","\u{1F994}","\u{1F987}","\u{1F43B}","\u{1F43B} \u{200D} \u{2744} \u{FE0F}","\u{1F428}","\u{1F43C}","\u{1F9A5}","\u{1F9A6}","\u{1F9A8}","\u{1F998}","\u{1F9A1}","\u{1F43E}"]],
    ["animal-bird", ["\u{1F983}","\u{1F414}","\u{1F413}","\u{1F423}","\u{1F424}","\u{1F425}","\u{1F426}","\u{1F427}","\u{1F54A}","\u{1F985}","\u{1F986}","\u{1F9A2}","\u{1F989}","\u{1F9A4}","\u{1FAB6}","\u{1F9A9}","\u{1F99A}","\u{1F99C}","\u{1FABD}","\u{1F426} \u{200D} \u{2B1B}","\u{1FABF}","\u{1F426} \u{200D} \u{1F525}"]],
    ["animal-amphibian", ["\u{1F438}"]],
    ["animal-reptile", ["\u{1F40A}","\u{1F422}","\u{1F98E}","\u{1F40D}","\u{1F432}","\u{1F409}","\u{1F995}","\u{1F996}"]],
    ["animal-marine", ["\u{1F433}","\u{1F40B}","\u{1F42C}","\u{1FACD}","\u{1F9AD}","\u{1F41F}","\u{1F420}","\u{1F421}","\u{1F988}","\u{1F419}","\u{1F41A}","\u{1FAB8}","\u{1FABC}","\u{1F980}","\u{1F99E}","\u{1F990}","\u{1F991}","\u{1F9AA}"]],
    ["animal-bug", ["\u{1F40C}","\u{1F98B}","\u{1FACC}","\u{1F41B}","\u{1F41C}","\u{1F41D}","\u{1FAB2}","\u{1F41E}","\u{1F997}","\u{1FAB3}","\u{1F577}","\u{1F578}","\u{1F982}","\u{1F99F}","\u{1FAB0}","\u{1FAB1}","\u{1F9A0}"]],
    ["plant-flower", ["\u{1F490}","\u{1F338}","\u{1F4AE}","\u{1FAB7}","\u{1F3F5}","\u{1F339}","\u{1F940}","\u{1F33A}","\u{1F33B}","\u{1F33C}","\u{1F337}","\u{1FABB}"]],
    ["plant-other", ["\u{1F331}","\u{1FAB4}","\u{1F332}","\u{1F333}","\u{1F334}","\u{1F335}","\u{1F33E}","\u{1F33F}","\u{2618}","\u{1F340}","\u{1F341}","\u{1F342}","\u{1F343}","\u{1FAB9}","\u{1FABA}","\u{1F344}","\u{1FABE}"]],
    ["food-fruit", ["\u{1F347}","\u{1F348}","\u{1F349}","\u{1F34A}","\u{1F34B}","\u{1F34B} \u{200D} \u{1F7E9}","\u{1F34C}","\u{1F34D}","\u{1F96D}","\u{1F34E}","\u{1F34F}","\u{1F350}","\u{1F351}","\u{1F352}","\u{1F353}","\u{1FAD0}","\u{1F95D}","\u{1F345}","\u{1FAD2}","\u{1F965}"]],
    ["food-vegetable", ["\u{1F951}","\u{1F346}","\u{1F954}","\u{1F955}","\u{1F33D}","\u{1F336}","\u{1FAD1}","\u{1F952}","\u{1FADD}","\u{1F96C}","\u{1F966}","\u{1F9C4}","\u{1F9C5}","\u{1F95C}","\u{1FAD8}","\u{1F330}","\u{1FADA}","\u{1FADB}","\u{1F344} \u{200D} \u{1F7EB}","\u{1FADC}"]],
    ["food-prepared", ["\u{1F35E}","\u{1F950}","\u{1F956}","\u{1FAD3}","\u{1F968}","\u{1F96F}","\u{1F95E}","\u{1F9C7}","\u{1F9C0}","\u{1F356}","\u{1F357}","\u{1F969}","\u{1F953}","\u{1F354}","\u{1F35F}","\u{1F355}","\u{1F32D}","\u{1F96A}","\u{1F32E}","\u{1F32F}","\u{1FAD4}","\u{1F959}","\u{1F9C6}","\u{1F95A}","\u{1F373}","\u{1F958}","\u{1F372}","\u{1FAD5}","\u{1F963}","\u{1F957}","\u{1F37F}","\u{1F9C8}","\u{1F9C2}","\u{1F96B}"]],
    ["food-asian", ["\u{1F371}","\u{1F358}","\u{1F359}","\u{1F35A}","\u{1F35B}","\u{1F35C}","\u{1F35D}","\u{1F360}","\u{1F362}","\u{1F363}","\u{1F364}","\u{1F365}","\u{1F96E}","\u{1F361}","\u{1F95F}","\u{1F960}","\u{1F961}"]],
    ["food-sweet", ["\u{1F366}","\u{1F367}","\u{1F368}","\u{1F369}","\u{1F36A}","\u{1F382}","\u{1F370}","\u{1F9C1}","\u{1F967}","\u{1F36B}","\u{1F36C}","\u{1F36D}","\u{1F36E}","\u{1F36F}"]],
    ["drink", ["\u{1F37C}","\u{1F95B}","\u{2615}","\u{1FAD6}","\u{1F375}","\u{1F376}","\u{1F37E}","\u{1F377}","\u{1F378}","\u{1F379}","\u{1F37A}","\u{1F37B}","\u{1F942}","\u{1F943}","\u{1FAD7}","\u{1F964}","\u{1F9CB}","\u{1F9C3}","\u{1F9C9}","\u{1F9CA}"]],
    ["dishware", ["\u{1F962}","\u{1F37D}","\u{1F374}","\u{1F944}","\u{1F52A}","\u{1FAD9}","\u{1F3FA}"]],
    ["place-map", ["\u{1F30D}","\u{1F30E}","\u{1F30F}","\u{1F310}","\u{1F5FA}","\u{1F5FE}","\u{1F9ED}"]],
    ["place-geographic", ["\u{1F3D4}","\u{26F0}","\u{1F6D8}","\u{1F30B}","\u{1F5FB}","\u{1F3D5}","\u{1F3D6}","\u{1F3DC}","\u{1F3DD}","\u{1F3DE}"]],
    ["place-building", ["\u{1F3DF}","\u{1F3DB}","\u{1F3D7}","\u{1F9F1}","\u{1FAA8}","\u{1FAB5}","\u{1F6D6}","\u{1F3D8}","\u{1F3DA}","\u{1F3E0}","\u{1F3E1}","\u{1F3E2}","\u{1F3E3}","\u{1F3E4}","\u{1F3E5}","\u{1F3E6}","\u{1F3E8}","\u{1F3E9}","\u{1F3EA}","\u{1F3EB}","\u{1F3EC}","\u{1F3ED}","\u{1F3EF}","\u{1F3F0}","\u{1F492}","\u{1F5FC}","\u{1F5FD}"]],
    ["place-religious", ["\u{26EA}","\u{1F54C}","\u{1F6D5}","\u{1F54D}","\u{26E9}","\u{1F54B}"]],
    ["place-other", ["\u{26F2}","\u{26FA}","\u{1F301}","\u{1F303}","\u{1F3D9}","\u{1F304}","\u{1F305}","\u{1F306}","\u{1F307}","\u{1F309}","\u{2668}","\u{1F3A0}","\u{1F6DD}","\u{1F3A1}","\u{1F3A2}","\u{1F488}","\u{1F3AA}"]],
    ["transport-ground", ["\u{1F682}","\u{1F683}","\u{1F684}","\u{1F685}","\u{1F686}","\u{1F687}","\u{1F688}","\u{1F689}","\u{1F68A}","\u{1F69D}","\u{1F69E}","\u{1F68B}","\u{1F68C}","\u{1F68D}","\u{1F68E}","\u{1F690}","\u{1F691}","\u{1F692}","\u{1F693}","\u{1F694}","\u{1F695}","\u{1F696}","\u{1F697}","\u{1F698}","\u{1F699}","\u{1F6FB}","\u{1F69A}","\u{1F69B}","\u{1F69C}","\u{1F3CE}","\u{1F3CD}","\u{1F6F5}","\u{1F9BD}","\u{1F9BC}","\u{1F6FA}","\u{1F6B2}","\u{1F6F4}","\u{1F6F9}","\u{1F6FC}","\u{1F68F}","\u{1F6E3}","\u{1F6E4}","\u{1F6E2}","\u{26FD}","\u{1F6DE}","\u{1F6A8}","\u{1F6A5}","\u{1F6A6}","\u{1F6D1}","\u{1F6A7}"]],
    ["transport-water", ["\u{1F6D9}","\u{2693}","\u{1F6DF}","\u{26F5}","\u{1F6F6}","\u{1F6A4}","\u{1F6F3}","\u{26F4}","\u{1F6E5}","\u{1F6A2}"]],
    ["transport-air", ["\u{2708}","\u{1F6E9}","\u{1F6EB}","\u{1F6EC}","\u{1FA82}","\u{1F4BA}","\u{1F681}","\u{1F69F}","\u{1F6A0}","\u{1F6A1}","\u{1F6F0}","\u{1F680}","\u{1F6F8}"]],
    ["hotel", ["\u{1F6CE}","\u{1F9F3}"]],
    ["time", ["\u{231B}","\u{23F3}","\u{231A}","\u{23F0}","\u{23F1}","\u{23F2}","\u{1F570}","\u{1F55B}","\u{1F567}","\u{1F550}","\u{1F55C}","\u{1F551}","\u{1F55D}","\u{1F552}","\u{1F55E}","\u{1F553}","\u{1F55F}","\u{1F554}","\u{1F560}","\u{1F555}","\u{1F561}","\u{1F556}","\u{1F562}","\u{1F557}","\u{1F563}","\u{1F558}","\u{1F564}","\u{1F559}","\u{1F565}","\u{1F55A}","\u{1F566}"]],
    ["sky & weather", ["\u{1F311}","\u{1F312}","\u{1F313}","\u{1F314}","\u{1F315}","\u{1F316}","\u{1F317}","\u{1F318}","\u{1F319}","\u{1F31A}","\u{1F31B}","\u{1F31C}","\u{1F321}","\u{2600}","\u{1F31D}","\u{1F31E}","\u{1FA90}","\u{2B50}","\u{1F31F}","\u{1F320}","\u{1F30C}","\u{2601}","\u{26C5}","\u{26C8}","\u{1F324}","\u{1F325}","\u{1F326}","\u{1F327}","\u{1F328}","\u{1F329}","\u{1F32A}","\u{1F32B}","\u{1F32C}","\u{1F300}","\u{1F308}","\u{1F302}","\u{2602}","\u{2614}","\u{26F1}","\u{26A1}","\u{2744}","\u{2603}","\u{26C4}","\u{2604}","\u{1FA8B}","\u{1F525}","\u{1F4A7}","\u{1F30A}"]],
    ["event", ["\u{1F383}","\u{1F384}","\u{1F386}","\u{1F387}","\u{1F9E8}","\u{2728}","\u{1F388}","\u{1F389}","\u{1F38A}","\u{1F38B}","\u{1F38D}","\u{1F38E}","\u{1F38F}","\u{1F390}","\u{1F391}","\u{1F9E7}","\u{1F380}","\u{1F381}","\u{1F397}","\u{1F39F}","\u{1F3AB}"]],
    ["award-medal", ["\u{1F396}","\u{1F3C6}","\u{1F3C5}","\u{1F947}","\u{1F948}","\u{1F949}"]],
    ["sport", ["\u{26BD}","\u{26BE}","\u{1F94E}","\u{1F3C0}","\u{1F3D0}","\u{1F3C8}","\u{1F3C9}","\u{1F3BE}","\u{1F94F}","\u{1F3B3}","\u{1F3CF}","\u{1F3D1}","\u{1F3D2}","\u{1F94D}","\u{1F3D3}","\u{1F3F8}","\u{1F94A}","\u{1F94B}","\u{1F945}","\u{26F3}","\u{26F8}","\u{1F3A3}","\u{1F93F}","\u{1F3BD}","\u{1F3BF}","\u{1F6F7}","\u{1F94C}"]],
    ["game", ["\u{1F3AF}","\u{1FA80}","\u{1FA81}","\u{1F52B}","\u{1F3B1}","\u{1F52E}","\u{1FA84}","\u{1F3AE}","\u{1F579}","\u{1F3B0}","\u{1F3B2}","\u{1F9E9}","\u{1F9F8}","\u{1FA85}","\u{1FAA9}","\u{1FA86}","\u{2660}","\u{2665}","\u{2666}","\u{2663}","\u{265F}","\u{1F0CF}","\u{1F004}","\u{1F3B4}"]],
    ["arts & crafts", ["\u{1F3AD}","\u{1F5BC}","\u{1F3A8}","\u{1F9F5}","\u{1FAA1}","\u{1F9F6}","\u{1FAA2}"]],
    ["clothing", ["\u{1F453}","\u{1F576}","\u{1F97D}","\u{1F97C}","\u{1F9BA}","\u{1F454}","\u{1F455}","\u{1F456}","\u{1F9E3}","\u{1F9E4}","\u{1F9E5}","\u{1F9E6}","\u{1F457}","\u{1F458}","\u{1F97B}","\u{1FA71}","\u{1FA72}","\u{1FA73}","\u{1F459}","\u{1F45A}","\u{1FAAD}","\u{1F45B}","\u{1F45C}","\u{1F45D}","\u{1F6CD}","\u{1F392}","\u{1FA74}","\u{1F45E}","\u{1F45F}","\u{1F97E}","\u{1F97F}","\u{1F460}","\u{1F461}","\u{1FA70}","\u{1F462}","\u{1FAAE}","\u{1F451}","\u{1F452}","\u{1F3A9}","\u{1F393}","\u{1F9E2}","\u{1FA96}","\u{26D1}","\u{1F4FF}","\u{1F484}","\u{1F48D}","\u{1F48E}"]],
    ["sound", ["\u{1F507}","\u{1F508}","\u{1F509}","\u{1F50A}","\u{1F4E2}","\u{1F4E3}","\u{1F4EF}","\u{1F514}","\u{1F515}"]],
    ["music", ["\u{1F3BC}","\u{1F3B5}","\u{1F3B6}","\u{1F399}","\u{1F39A}","\u{1F39B}","\u{1F3A4}","\u{1F3A7}","\u{1F4FB}"]],
    ["musical-instrument", ["\u{1F3B7}","\u{1F3BA}","\u{1FA8A}","\u{1FA97}","\u{1F3B8}","\u{1F3B9}","\u{1F3BB}","\u{1FA95}","\u{1F941}","\u{1FA98}","\u{1FA87}","\u{1FA88}","\u{1FA89}"]],
    ["phone", ["\u{1F4F1}","\u{1F4F2}","\u{260E}","\u{1F4DE}","\u{1F4DF}","\u{1F4E0}"]],
    ["computer", ["\u{1F50B}","\u{1FAAB}","\u{1F50C}","\u{1F4BB}","\u{1F5A5}","\u{1F5A8}","\u{2328}","\u{1F5B1}","\u{1F5B2}","\u{1F4BD}","\u{1F4BE}","\u{1F4BF}","\u{1F4C0}","\u{1F9EE}"]],
    ["light & video", ["\u{1F3A5}","\u{1F39E}","\u{1F4FD}","\u{1F3AC}","\u{1F4FA}","\u{1F4F7}","\u{1F4F8}","\u{1F4F9}","\u{1F4FC}","\u{1F50D}","\u{1F50E}","\u{1F56F}","\u{1F4A1}","\u{1F526}","\u{1F3EE}","\u{1FA94}"]],
    ["book-paper", ["\u{1F4D4}","\u{1F4D5}","\u{1F4D6}","\u{1F4D7}","\u{1F4D8}","\u{1F4D9}","\u{1F4DA}","\u{1F4D3}","\u{1F4D2}","\u{1F4C3}","\u{1F4DC}","\u{1F4C4}","\u{1F4F0}","\u{1F5DE}","\u{1F4D1}","\u{1F516}","\u{1F3F7}"]],
    ["money", ["\u{1FA99}","\u{1F4B0}","\u{1FA8E}","\u{1F4B4}","\u{1F4B5}","\u{1F4B6}","\u{1F4B7}","\u{1F4B8}","\u{1F4B3}","\u{1F9FE}","\u{1F4B9}"]],
    ["mail", ["\u{2709}","\u{1F4E7}","\u{1F4E8}","\u{1F4E9}","\u{1F4E4}","\u{1F4E5}","\u{1F4E6}","\u{1F4EB}","\u{1F4EA}","\u{1F4EC}","\u{1F4ED}","\u{1F4EE}","\u{1F5F3}"]],
    ["writing", ["\u{270F}","\u{2712}","\u{1F58B}","\u{1F58A}","\u{1F58C}","\u{1F58D}","\u{1F4DD}","\u{1FA8C}"]],
    ["office", ["\u{1F4BC}","\u{1F4C1}","\u{1F4C2}","\u{1F5C2}","\u{1F4C5}","\u{1F4C6}","\u{1F5D2}","\u{1F5D3}","\u{1F4C7}","\u{1F4C8}","\u{1F4C9}","\u{1F4CA}","\u{1F4CB}","\u{1F4CC}","\u{1F4CD}","\u{1F4CE}","\u{1F587}","\u{1F4CF}","\u{1F4D0}","\u{2702}","\u{1F5C3}","\u{1F5C4}","\u{1F5D1}"]],
    ["lock", ["\u{1F512}","\u{1F513}","\u{1F50F}","\u{1F510}","\u{1F511}","\u{1F5DD}"]],
    ["tool", ["\u{1FA8D}","\u{1F528}","\u{1FA93}","\u{26CF}","\u{2692}","\u{1F6E0}","\u{1F5E1}","\u{2694}","\u{1F4A3}","\u{1FA83}","\u{1F3F9}","\u{1F6E1}","\u{1FA9A}","\u{1F527}","\u{1FA9B}","\u{1F529}","\u{2699}","\u{1F5DC}","\u{2696}","\u{1F9AF}","\u{1F517}","\u{26D3} \u{FE0F} \u{200D} \u{1F4A5}","\u{26D3}","\u{1FA9D}","\u{1F9F0}","\u{1F9F2}","\u{1FA9C}","\u{1FA8F}"]],
    ["science", ["\u{2697}","\u{1F9EA}","\u{1F9EB}","\u{1F9EC}","\u{1F52C}","\u{1F52D}","\u{1F4E1}"]],
    ["medical", ["\u{1F489}","\u{1FA78}","\u{1F48A}","\u{1FA79}","\u{1FA7C}","\u{1FA7A}","\u{1FA7B}"]],
    ["household", ["\u{1F6AA}","\u{1F6D7}","\u{1FA9E}","\u{1FA9F}","\u{1F6CF}","\u{1F6CB}","\u{1FA91}","\u{1F6BD}","\u{1FAA0}","\u{1F6BF}","\u{1F6C1}","\u{1FAA4}","\u{1FA92}","\u{1F9F4}","\u{1F9F7}","\u{1F9F9}","\u{1F9FA}","\u{1F9FB}","\u{1FAA3}","\u{1F9FC}","\u{1FAE7}","\u{1FAA5}","\u{1F9FD}","\u{1F9EF}","\u{1F6D2}"]],
    ["other-object", ["\u{1F6AC}","\u{26B0}","\u{1FAA6}","\u{26B1}","\u{1F9FF}","\u{1FAAC}","\u{1F5FF}","\u{1FAA7}","\u{1FAAA}"]],
    ["transport-sign", ["\u{1F3E7}","\u{1F6AE}","\u{1F6B0}","\u{267F}","\u{1F6B9}","\u{1F6BA}","\u{1F6BB}","\u{1F6BC}","\u{1F6BE}","\u{1F6C2}","\u{1F6C3}","\u{1F6C4}","\u{1F6C5}"]],
    ["warning", ["\u{26A0}","\u{1F6B8}","\u{26D4}","\u{1F6AB}","\u{1F6B3}","\u{1F6AD}","\u{1F6AF}","\u{1F6B1}","\u{1F6B7}","\u{1F4F5}","\u{1F51E}","\u{2622}","\u{2623}"]],
    ["arrow", ["\u{2B06}","\u{2197}","\u{27A1}","\u{2198}","\u{2B07}","\u{2199}","\u{2B05}","\u{2196}","\u{2195}","\u{2194}","\u{21A9}","\u{21AA}","\u{2934}","\u{2935}","\u{1F503}","\u{1F504}","\u{1F519}","\u{1F51A}","\u{1F51B}","\u{1F51C}","\u{1F51D}"]],
    ["religion", ["\u{1F6D0}","\u{269B}","\u{1F549}","\u{2721}","\u{2638}","\u{262F}","\u{271D}","\u{2626}","\u{262A}","\u{262E}","\u{1F54E}","\u{1F52F}","\u{1FAAF}"]],
    ["zodiac", ["\u{2648}","\u{2649}","\u{264A}","\u{264B}","\u{264C}","\u{264D}","\u{264E}","\u{264F}","\u{2650}","\u{2651}","\u{2652}","\u{2653}","\u{26CE}"]],
    ["av-symbol", ["\u{1F500}","\u{1F501}","\u{1F502}","\u{25B6}","\u{23E9}","\u{23ED}","\u{23EF}","\u{25C0}","\u{23EA}","\u{23EE}","\u{1F53C}","\u{23EB}","\u{1F53D}","\u{23EC}","\u{23F8}","\u{23F9}","\u{23FA}","\u{23CF}","\u{1F3A6}","\u{1F505}","\u{1F506}","\u{1F4F6}","\u{1F6DC}","\u{1F4F3}","\u{1F4F4}"]],
    ["gender", ["\u{2640}","\u{2642}","\u{26A7}"]],
    ["math", ["\u{2716}","\u{2795}","\u{2796}","\u{2797}","\u{1F7F0}","\u{267E}"]],
    ["punctuation", ["\u{203C}","\u{2049}","\u{2753}","\u{2754}","\u{2755}","\u{2757}","\u{3030}"]],
    ["currency", ["\u{1F4B1}","\u{1F4B2}"]],
    ["other-symbol", ["\u{2695}","\u{267B}","\u{269C}","\u{1F531}","\u{1F4DB}","\u{1F530}","\u{2B55}","\u{2705}","\u{2611}","\u{2714}","\u{274C}","\u{274E}","\u{27B0}","\u{27BF}","\u{303D}","\u{2733}","\u{2734}","\u{2747}","\u{00A9}","\u{00AE}","\u{2122}","\u{1FADF}"]],
    ["keycap", ["\u{0023} \u{FE0F} \u{20E3}","\u{002A} \u{FE0F} \u{20E3}","\u{0030} \u{FE0F} \u{20E3}","\u{0031} \u{FE0F} \u{20E3}","\u{0032} \u{FE0F} \u{20E3}","\u{0033} \u{FE0F} \u{20E3}","\u{0034} \u{FE0F} \u{20E3}","\u{0035} \u{FE0F} \u{20E3}","\u{0036} \u{FE0F} \u{20E3}","\u{0037} \u{FE0F} \u{20E3}","\u{0038} \u{FE0F} \u{20E3}","\u{0039} \u{FE0F} \u{20E3}","\u{1F51F}"]],
    ["alphanum", ["\u{1F520}","\u{1F521}","\u{1F522}","\u{1F523}","\u{1F524}","\u{1F170}","\u{1F18E}","\u{1F171}","\u{1F191}","\u{1F192}","\u{1F193}","\u{2139}","\u{1F194}","\u{24C2}","\u{1F195}","\u{1F196}","\u{1F17E}","\u{1F197}","\u{1F17F}","\u{1F198}","\u{1F199}","\u{1F19A}","\u{1F201}","\u{1F202}","\u{1F237}","\u{1F236}","\u{1F22F}","\u{1F250}","\u{1F239}","\u{1F21A}","\u{1F232}","\u{1F251}","\u{1F238}","\u{1F234}","\u{1F233}","\u{3297}","\u{3299}","\u{1F23A}","\u{1F235}"]],
    ["geometric", ["\u{1F534}","\u{1F7E0}","\u{1F7E1}","\u{1F7E2}","\u{1F535}","\u{1F7E3}","\u{1F7E4}","\u{26AB}","\u{26AA}","\u{1F7E5}","\u{1F7E7}","\u{1F7E8}","\u{1F7E9}","\u{1F7E6}","\u{1F7EA}","\u{1F7EB}","\u{2B1B}","\u{2B1C}","\u{25FC}","\u{25FB}","\u{25FE}","\u{25FD}","\u{25AA}","\u{25AB}","\u{1F536}","\u{1F537}","\u{1F538}","\u{1F539}","\u{1F53A}","\u{1F53B}","\u{1F4A0}","\u{1F518}","\u{1F533}","\u{1F532}"]],
    ["flag", ["\u{1F3C1}","\u{1F6A9}","\u{1F38C}","\u{1F3F4}","\u{1F3F3}","\u{1F3F3} \u{FE0F} \u{200D} \u{1F308}","\u{1F3F3} \u{FE0F} \u{200D} \u{26A7} \u{FE0F}","\u{1F3F4} \u{200D} \u{2620} \u{FE0F}"]],
    ["country-flag", ["\u{1F1E6} \u{1F1E8}","\u{1F1E6} \u{1F1E9}","\u{1F1E6} \u{1F1EA}","\u{1F1E6} \u{1F1EB}","\u{1F1E6} \u{1F1EC}","\u{1F1E6} \u{1F1EE}","\u{1F1E6} \u{1F1F1}","\u{1F1E6} \u{1F1F2}","\u{1F1E6} \u{1F1F4}","\u{1F1E6} \u{1F1F6}","\u{1F1E6} \u{1F1F7}","\u{1F1E6} \u{1F1F8}","\u{1F1E6} \u{1F1F9}","\u{1F1E6} \u{1F1FA}","\u{1F1E6} \u{1F1FC}","\u{1F1E6} \u{1F1FD}","\u{1F1E6} \u{1F1FF}","\u{1F1E7} \u{1F1E6}","\u{1F1E7} \u{1F1E7}","\u{1F1E7} \u{1F1E9}","\u{1F1E7} \u{1F1EA}","\u{1F1E7} \u{1F1EB}","\u{1F1E7} \u{1F1EC}","\u{1F1E7} \u{1F1ED}","\u{1F1E7} \u{1F1EE}","\u{1F1E7} \u{1F1EF}","\u{1F1E7} \u{1F1F1}","\u{1F1E7} \u{1F1F2}","\u{1F1E7} \u{1F1F3}","\u{1F1E7} \u{1F1F4}","\u{1F1E7} \u{1F1F6}","\u{1F1E7} \u{1F1F7}","\u{1F1E7} \u{1F1F8}","\u{1F1E7} \u{1F1F9}","\u{1F1E7} \u{1F1FB}","\u{1F1E7} \u{1F1FC}","\u{1F1E7} \u{1F1FE}","\u{1F1E7} \u{1F1FF}","\u{1F1E8} \u{1F1E6}","\u{1F1E8} \u{1F1E8}","\u{1F1E8} \u{1F1E9}","\u{1F1E8} \u{1F1EB}","\u{1F1E8} \u{1F1EC}","\u{1F1E8} \u{1F1ED}","\u{1F1E8} \u{1F1EE}","\u{1F1E8} \u{1F1F0}","\u{1F1E8} \u{1F1F1}","\u{1F1E8} \u{1F1F2}","\u{1F1E8} \u{1F1F3}","\u{1F1E8} \u{1F1F4}","\u{1F1E8} \u{1F1F5}","\u{1F1E8} \u{1F1F6}","\u{1F1E8} \u{1F1F7}","\u{1F1E8} \u{1F1FA}","\u{1F1E8} \u{1F1FB}","\u{1F1E8} \u{1F1FC}","\u{1F1E8} \u{1F1FD}","\u{1F1E8} \u{1F1FE}","\u{1F1E8} \u{1F1FF}","\u{1F1E9} \u{1F1EA}","\u{1F1E9} \u{1F1EC}","\u{1F1E9} \u{1F1EF}","\u{1F1E9} \u{1F1F0}","\u{1F1E9} \u{1F1F2}","\u{1F1E9} \u{1F1F4}","\u{1F1E9} \u{1F1FF}","\u{1F1EA} \u{1F1E6}","\u{1F1EA} \u{1F1E8}","\u{1F1EA} \u{1F1EA}","\u{1F1EA} \u{1F1EC}","\u{1F1EA} \u{1F1ED}","\u{1F1EA} \u{1F1F7}","\u{1F1EA} \u{1F1F8}","\u{1F1EA} \u{1F1F9}","\u{1F1EA} \u{1F1FA}","\u{1F1EB} \u{1F1EE}","\u{1F1EB} \u{1F1EF}","\u{1F1EB} \u{1F1F0}","\u{1F1EB} \u{1F1F2}","\u{1F1EB} \u{1F1F4}","\u{1F1EB} \u{1F1F7}","\u{1F1EC} \u{1F1E6}","\u{1F1EC} \u{1F1E7}","\u{1F1EC} \u{1F1E9}","\u{1F1EC} \u{1F1EA}","\u{1F1EC} \u{1F1EB}","\u{1F1EC} \u{1F1EC}","\u{1F1EC} \u{1F1ED}","\u{1F1EC} \u{1F1EE}","\u{1F1EC} \u{1F1F1}","\u{1F1EC} \u{1F1F2}","\u{1F1EC} \u{1F1F3}","\u{1F1EC} \u{1F1F5}","\u{1F1EC} \u{1F1F6}","\u{1F1EC} \u{1F1F7}","\u{1F1EC} \u{1F1F8}","\u{1F1EC} \u{1F1F9}","\u{1F1EC} \u{1F1FA}","\u{1F1EC} \u{1F1FC}","\u{1F1EC} \u{1F1FE}","\u{1F1ED} \u{1F1F0}","\u{1F1ED} \u{1F1F2}","\u{1F1ED} \u{1F1F3}","\u{1F1ED} \u{1F1F7}","\u{1F1ED} \u{1F1F9}","\u{1F1ED} \u{1F1FA}","\u{1F1EE} \u{1F1E8}","\u{1F1EE} \u{1F1E9}","\u{1F1EE} \u{1F1EA}","\u{1F1EE} \u{1F1F1}","\u{1F1EE} \u{1F1F2}","\u{1F1EE} \u{1F1F3}","\u{1F1EE} \u{1F1F4}","\u{1F1EE} \u{1F1F6}","\u{1F1EE} \u{1F1F7}","\u{1F1EE} \u{1F1F8}","\u{1F1EE} \u{1F1F9}","\u{1F1EF} \u{1F1EA}","\u{1F1EF} \u{1F1F2}","\u{1F1EF} \u{1F1F4}","\u{1F1EF} \u{1F1F5}","\u{1F1F0} \u{1F1EA}","\u{1F1F0} \u{1F1EC}","\u{1F1F0} \u{1F1ED}","\u{1F1F0} \u{1F1EE}","\u{1F1F0} \u{1F1F2}","\u{1F1F0} \u{1F1F3}","\u{1F1F0} \u{1F1F5}","\u{1F1F0} \u{1F1F7}","\u{1F1F0} \u{1F1FC}","\u{1F1F0} \u{1F1FE}","\u{1F1F0} \u{1F1FF}","\u{1F1F1} \u{1F1E6}","\u{1F1F1} \u{1F1E7}","\u{1F1F1} \u{1F1E8}","\u{1F1F1} \u{1F1EE}","\u{1F1F1} \u{1F1F0}","\u{1F1F1} \u{1F1F7}","\u{1F1F1} \u{1F1F8}","\u{1F1F1} \u{1F1F9}","\u{1F1F1} \u{1F1FA}","\u{1F1F1} \u{1F1FB}","\u{1F1F1} \u{1F1FE}","\u{1F1F2} \u{1F1E6}","\u{1F1F2} \u{1F1E8}","\u{1F1F2} \u{1F1E9}","\u{1F1F2} \u{1F1EA}","\u{1F1F2} \u{1F1EB}","\u{1F1F2} \u{1F1EC}","\u{1F1F2} \u{1F1ED}","\u{1F1F2} \u{1F1F0}","\u{1F1F2} \u{1F1F1}","\u{1F1F2} \u{1F1F2}","\u{1F1F2} \u{1F1F3}","\u{1F1F2} \u{1F1F4}","\u{1F1F2} \u{1F1F5}","\u{1F1F2} \u{1F1F6}","\u{1F1F2} \u{1F1F7}","\u{1F1F2} \u{1F1F8}","\u{1F1F2} \u{1F1F9}","\u{1F1F2} \u{1F1FA}","\u{1F1F2} \u{1F1FB}","\u{1F1F2} \u{1F1FC}","\u{1F1F2} \u{1F1FD}","\u{1F1F2} \u{1F1FE}","\u{1F1F2} \u{1F1FF}","\u{1F1F3} \u{1F1E6}","\u{1F1F3} \u{1F1E8}","\u{1F1F3} \u{1F1EA}","\u{1F1F3} \u{1F1EB}","\u{1F1F3} \u{1F1EC}","\u{1F1F3} \u{1F1EE}","\u{1F1F3} \u{1F1F1}","\u{1F1F3} \u{1F1F4}","\u{1F1F3} \u{1F1F5}","\u{1F1F3} \u{1F1F7}","\u{1F1F3} \u{1F1FA}","\u{1F1F3} \u{1F1FF}","\u{1F1F4} \u{1F1F2}","\u{1F1F5} \u{1F1E6}","\u{1F1F5} \u{1F1EA}","\u{1F1F5} \u{1F1EB}","\u{1F1F5} \u{1F1EC}","\u{1F1F5} \u{1F1ED}","\u{1F1F5} \u{1F1F0}","\u{1F1F5} \u{1F1F1}","\u{1F1F5} \u{1F1F2}","\u{1F1F5} \u{1F1F3}","\u{1F1F5} \u{1F1F7}","\u{1F1F5} \u{1F1F8}","\u{1F1F5} \u{1F1F9}","\u{1F1F5} \u{1F1FC}","\u{1F1F5} \u{1F1FE}","\u{1F1F6} \u{1F1E6}","\u{1F1F7} \u{1F1EA}","\u{1F1F7} \u{1F1F4}","\u{1F1F7} \u{1F1F8}","\u{1F1F7} \u{1F1FA}","\u{1F1F7} \u{1F1FC}","\u{1F1F8} \u{1F1E6}","\u{1F1F8} \u{1F1E7}","\u{1F1F8} \u{1F1E8}","\u{1F1F8} \u{1F1E9}","\u{1F1F8} \u{1F1EA}","\u{1F1F8} \u{1F1EC}","\u{1F1F8} \u{1F1ED}","\u{1F1F8} \u{1F1EE}","\u{1F1F8} \u{1F1EF}","\u{1F1F8} \u{1F1F0}","\u{1F1F8} \u{1F1F1}","\u{1F1F8} \u{1F1F2}","\u{1F1F8} \u{1F1F3}","\u{1F1F8} \u{1F1F4}","\u{1F1F8} \u{1F1F7}","\u{1F1F8} \u{1F1F8}","\u{1F1F8} \u{1F1F9}","\u{1F1F8} \u{1F1FB}","\u{1F1F8} \u{1F1FD}","\u{1F1F8} \u{1F1FE}","\u{1F1F8} \u{1F1FF}","\u{1F1F9} \u{1F1E6}","\u{1F1F9} \u{1F1E8}","\u{1F1F9} \u{1F1E9}","\u{1F1F9} \u{1F1EB}","\u{1F1F9} \u{1F1EC}","\u{1F1F9} \u{1F1ED}","\u{1F1F9} \u{1F1EF}","\u{1F1F9} \u{1F1F0}","\u{1F1F9} \u{1F1F1}","\u{1F1F9} \u{1F1F2}","\u{1F1F9} \u{1F1F3}","\u{1F1F9} \u{1F1F4}","\u{1F1F9} \u{1F1F7}","\u{1F1F9} \u{1F1F9}","\u{1F1F9} \u{1F1FB}","\u{1F1F9} \u{1F1FF}","\u{1F1FA} \u{1F1E6}","\u{1F1FA} \u{1F1EC}","\u{1F1FA} \u{1F1F2}","\u{1F1FA} \u{1F1F3}","\u{1F1FA} \u{1F1F8}","\u{1F1FA} \u{1F1FE}","\u{1F1FA} \u{1F1FF}","\u{1F1FB} \u{1F1E6}","\u{1F1FB} \u{1F1E8}","\u{1F1FB} \u{1F1EA}","\u{1F1FB} \u{1F1EC}","\u{1F1FB} \u{1F1EE}","\u{1F1FB} \u{1F1F3}","\u{1F1FB} \u{1F1FA}","\u{1F1FC} \u{1F1EB}","\u{1F1FC} \u{1F1F8}","\u{1F1FD} \u{1F1F0}","\u{1F1FE} \u{1F1EA}","\u{1F1FE} \u{1F1F9}","\u{1F1FF} \u{1F1E6}","\u{1F1FF} \u{1F1F2}","\u{1F1FF} \u{1F1FC}"]],
    ["subdivision-flag", ["\u{1F3F4} \u{E0067} \u{E0062} \u{E0065} \u{E006E} \u{E0067} \u{E007F}","\u{1F3F4} \u{E0067} \u{E0062} \u{E0073} \u{E0063} \u{E0074} \u{E007F}","\u{1F3F4} \u{E0067} \u{E0062} \u{E0077} \u{E006C} \u{E0073} \u{E007F}"]]
    ])
    

使用 ai 写一个临时的爬虫

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
const https = require('https');
const fs = require('fs');

/**
 * 抓取网页 HTML
 */
function fetchHTML(url) {
  return new Promise((resolve, reject) => {
    https.get(url, (res) => {
      if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
        return resolve(fetchHTML(res.headers.location));
      }
      let data = '';
      res.on('data', (chunk) => { data += chunk; });
      res.on('end', () => resolve(data));
      res.on('error', reject);
    }).on('error', reject);
  });
}

/**
 * 解码 HTML 实体
 */
function decodeHtmlEntities(str) {
  return str
    .replace(/&amp;/g, '&')
    .replace(/&lt;/g, '<')
    .replace(/&gt;/g, '>')
    .replace(/&quot;/g, '"')
    .replace(/&#39;/g, "'")
    .replace(/&apos;/g, "'");
}

/**
 * 去除 HTML 标签,只保留纯文本
 */
function stripHtmlTags(str) {
  return str.replace(/<[^>]+>/g, '').trim();
}

/**
 * 将 "U+1F600" 或 "U+1F636 U+200D U+1F32B U+FE0F" 转为 "\u{1F600}" 或 "\u{1F636}\u{200D}\u{1F32B}\u{FE0F}"
 * 只有一个反斜杠
 */
function convertUnicodeFormat(codeStr) {
  const codePoints = [];
  const regex = /U\+([0-9a-fA-F]+)/g;
  let match;
  while ((match = regex.exec(codeStr)) !== null) {
    codePoints.push(match[1].toUpperCase());
  }
  return codePoints.map(cp => '\\u{' + cp + '}').join('');
}

/**
 * 手动序列化 JSON,确保 unicode 字段中只有一个反斜杠
 * 不使用 JSON.stringify,避免反斜杠被转义
 */
function buildJSON(output) {
  let lines = [];
  lines.push('{');
  lines.push('  "source": ' + JSON.stringify(output.source) + ',');
  lines.push('  "version": ' + JSON.stringify(output.version) + ',');
  lines.push('  "total": ' + output.total + ',');
  lines.push('  "data": [');
  for (let i = 0; i < output.data.length; i++) {
    const e = output.data[i];
    lines.push('    {');
    lines.push('      "category": ' + JSON.stringify(e.category) + ',');
    lines.push('      "num": ' + e.num + ',');
    lines.push('      "code": ' + JSON.stringify(e.code) + ',');
    // unicode 字段直接写入字面量,不经过 JSON.stringify 转义反斜杠
    lines.push('      "unicode": "' + e.unicode + '",');
    lines.push('      "shortName": ' + JSON.stringify(e.shortName));
    lines.push('    }' + (i < output.data.length - 1 ? ',' : ''));
  }
  lines.push('  ]');
  lines.push('}');
  return lines.join('\n');
}

/**
 * 解析 emoji 表格
 */
function parseEmojiTable(html) {
  const results = [];
  let currentCategory = '';

  const trRegex = /<tr[^>]*>([\s\S]*?)<\/tr>/g;
  let trMatch;

  while ((trMatch = trRegex.exec(html)) !== null) {
    const rowContent = trMatch[1];

    // 检查是否为 mediumhead 分类行
    if (rowContent.includes('mediumhead')) {
      const titleMatch = rowContent.match(/<a[^>]*>([\s\S]*?)<\/a>/);
      if (titleMatch) {
        currentCategory = decodeHtmlEntities(titleMatch[1].trim());
      }
      continue;
    }

    // 跳过表头行(th 标签)
    if (/<th[\s>]/.test(rowContent)) continue;

    // 提取所有 td 单元格
    const tds = [];
    const tdRegex = /<td[^>]*>([\s\S]*?)<\/td>/g;
    let tdMatch;
    while ((tdMatch = tdRegex.exec(rowContent)) !== null) {
      tds.push(tdMatch[1]);
    }

    // 数据行应该有 9 列
    if (tds.length < 9) continue;

    // 第一列是序号
    const numText = stripHtmlTags(decodeHtmlEntities(tds[0]));
    if (!numText || !/^\d+$/.test(numText)) continue;
    const num = parseInt(numText, 10);

    // 第二列是 Code (含 <a> 标签),去除标签后得到 "U+1F600"
    const code = stripHtmlTags(decodeHtmlEntities(tds[1]));

    // CLDR Short Name 在最后一列 (index 8)
    let shortName = stripHtmlTags(decodeHtmlEntities(tds[8]));

    // 去除新增 emoji 标记 ⊛
    shortName = shortName.replace(/^⊛\s*/, '').trim();

    // 转换 unicode 格式
    const unicode = convertUnicodeFormat(code);

    results.push({
      category: currentCategory,
      num: num,
      code: code,
      unicode: unicode,
      shortName: shortName
    });
  }

  return results;
}

/**
 * 主函数
 */
async function main() {
  const url = 'https://unicode.org/emoji/charts/full-emoji-list.html';
  console.log('正在抓取网页...');
  const html = await fetchHTML(url);
  console.log('网页抓取完成,开始解析...');

  const emojiData = parseEmojiTable(html);
  console.log(`解析完成,共 ${emojiData.length} 条 emoji 数据`);

  const output = {
    source: url,
    version: 'Unicode Emoji',
    total: emojiData.length,
    data: emojiData
  };

  // 手动构建 JSON 字符串,确保 unicode 字段只有一个反斜杠
  const jsonStr = buildJSON(output);
  const outputPath = __dirname + '/emoji-data.json';
  fs.writeFileSync(outputPath, jsonStr, 'utf-8');
  console.log(`数据已保存到 ${outputPath}`);

  // 打印前几条示例
  console.log('\n示例数据(前5条):');
  const preview = emojiData.slice(0, 5).map(e => ({
    category: e.category,
    num: e.num,
    code: e.code,
    unicode: e.unicode,
    shortName: e.shortName
  }));
  // 用自定义输出展示实际效果
  for (const e of preview) {
    console.log(`  { num: ${e.num}, code: "${e.code}", unicode: "${e.unicode}", shortName: "${e.shortName}", category: "${e.category}" }`);
  }
}

main().catch(err => {
  console.error('执行出错:', err);
  process.exit(1);
});

2. 制作「新建标签」页面 ⇧

路由 @/router/routes.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import type { RouteRecordRaw } from 'vue-router'
import { WelcomeView } from '@/views/WelcomeView.tsx'
import { Welcome1stPage } from '@/modules/welcome/Welcome1stPage.tsx'
import { Welcome2ndPage } from '@/modules/welcome/Welcome2ndPage.tsx'
import { Welcome3rdPage } from '@/modules/welcome/Welcome3rdPage.tsx'
import { Welcome4thPage } from '@/modules/welcome/Welcome4thPage.tsx'
import { StartAccountsView } from '@/views/StartAccountsView.tsx'
import { ItemsView } from '@/views/ItemsView.tsx'
import { ItemList } from '@/views/ItemList.tsx'
import { ItemCreate } from '@/views/ItemCreate.tsx'
import { TagView } from '@/views/TagView.tsx'
import { TagDetailEditView } from '@/views/TagDetailEditView.tsx'
import { TagCreateView } from '@/views/TagCreateView.tsx'

export const routes: RouteRecordRaw[] = [
  {
    path: '/',
    redirect: '/welcome/1',
  },
  {
    path: '/welcome',
    name: 'welcome',
    component: WelcomeView,
    children: [
      // { path: '', name: 'default', component: WelCome1stPage },
      { path: '', name: 'welcomeDefault', redirect: '/welcome/1' },
      { path: '1', name: 'welcomePig', components: { main: Welcome1stPage } },
      { path: '2', name: 'welcomeClock', components: { main: Welcome2ndPage } },
      { path: '3', name: 'welcomeChart', components: { main: Welcome3rdPage } },
      { path: '4', name: 'welcomeCloud', components: { main: Welcome4thPage } },
    ],
  },
  { path: '/start', name: 'startAccounts', component: StartAccountsView },
  /* 记账项目相关:项目列表页、创建页 */
  {
    path: '/item',
    name: 'item',
    component: ItemsView,
    children: [
      {
        path: '', // 默认
        name: 'itemList',
        component: ItemList,
      },
      {
        path: 'create',
        component: ItemCreate,
      },
    ],
  },
  /* 标签项目相关:标签详细页、创建页 */
  {
    path: '/tags',
    name: 'tags',
    component: TagView,
    children: [
      {path: 'create', name: 'tagCreate', component: TagCreateView,},
      // {path: '', name: 'tagList', component: TagView,},
      {path: ':id', name: 'tagEdit', component: TagDetailEditView,},
    ]
  },
]

@/views/TagCreateView.tsx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import { defineComponent } from 'vue'
import { MainLayout } from '@/components/layout/MainLayout.tsx'
import { SvgIcon } from '@/components/icons/SvgIcon.tsx'
import { TagForm } from '@/modules/tags/TagForm.tsx'

export const TagCreateView = defineComponent({
  name: 'TagCreateView',
  setup(/* _props, _ctx */) {
    return () => (
      <MainLayout>{{
        title: () => '新建标签',
        icon: () => <SvgIcon name="back-arrow" size="1.5em" onClick={() => {}} />,
        default: () => (
          <TagForm />
        ),
      }}</MainLayout>
    )
  },
})

@/modules/tags/TagForm.tsx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { defineComponent } from 'vue'

/**
 * @Description: 标签表单
 * @Author: xmasuhai <xmasuhai@163.com>
 * @Date: 2026-10-17 15:55:38
 * @LastEditors: xmasuhai <xmasuhai@163.com>
 * @LastEditTime: 2026-10-18 17:23:44
 * @FilePath: content/post/山竹记账/【山竹记账前端-vue】11.自定义表单组件-封装 EmojiSelect 组件.md
 */
export const TagForm = defineComponent({
  name: 'TagForm',
  setup(/* _props, _ctx */) {
    const navList = [
      '表情',
      '手势',
      '职业',
      '衣服',
      '动物',
      '自然',
      '实物',
      '运动',
    ]
    return () => (
      <form>
        <div>
          <label>
            <span>标签名称</span>
            <input class="b-1 b-[#ddd]" />
          </label>
        </div>

        <div>
          <label>
            <span>符号</span>
            <div>
              <nav>
                {navList.map(item => <span>{item}</span>)}
              </nav>

              <ul>
                <li>1</li>
                <li>2</li>
                <li>3</li>
                <li>4</li>
                <li>5</li>
                <li>6</li>
                <li>7</li>
                <li>8</li>
                <li>9</li>
                <li>10</li>
                <li>11</li>
              </ul>
            </div>
          </label>
        </div>

        <div>
          <p>记账时长按即可进行编辑</p>
        </div>

        <div>
          <button>确定</button>
        </div>
      </form>
    )
  },
})

3. 添加「新建标签」页面样式 ⇧

@/modules/tags/TagForm.tsx

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
import { defineComponent } from 'vue'
import { BarButton } from '@/components/BarButton.tsx'
import { cn } from 'cn'

export const TagForm = defineComponent({
  name: 'TagForm',
  setup(/* _props, _ctx */) {
    const navList = [
      '表情',
      '手势',
      '职业',
      '衣服',
      '动物',
      '自然',
      '实物',
      '运动',
      '表情',
      '手势',
      '职业',
      '衣服',
      '动物',
      '自然',
      '实物',
      '运动',
    ]
    return () => (
      <form class="form p-1em min-h-720px h-full">
        <div class="formRow mt-0.5em flex-grow-0">
          <label for="tag-name" class="">
            <span class="formItem_name">标签名称</span>
            <div class="formItem_value flex mt-0.25em">
              <input
                id="tag-name"
                class={cn(
                  'flex-grow-1 min-h-[var(--input-min-height)] max-w-100%',
                  'b-1 rounded-[var(--input-radius)]',
                  'text-18px p-x-1em shadow-[inset_0_0_3px_var(--input-shadow)]',
                  // 动态切换边框颜色 hasError
                  Math.random() > .5 ? 'b-[var(--input-border-color)]' : 'b-[var(--error-color)]'
                )}/>
            </div>
            <div class="m-t-.25em text-12px color-[var(--error-color)]">
              <span>必填</span>
            </div>
          </label>
        </div>

        <div class="formRow mt-0.5em">
          <label class="flex flex-col">
            <span class="formItem_name">符号</span>

            <div class={cn(
              'formValue',
              'flex mt-0.25em',
            )}>
              <div class={cn(
                'formItem emojiList error',
                'min-h-[var(--input-min-height)] max-w-full flex-grow-1',
                'b-1 rounded-[var(--input-radius)] text-14px',
                // 动态切换边框颜色 hasError
                Math.random() > .5 ? 'b-[var(--input-border-color)]' : 'b-[var(--error-color)]'
              )}>
                <nav class={cn(
                  'flex flex-nowrap overflow-auto mx-1em py-0 scrollbar-hide',
                  '[&>span]:(shrink-0 inline-block p-.5em text-[var(--emoji-nav-text)] whitespace-nowrap)',
                  '[&>span.selected]:text-[var(--emoji-nav-text-selected)]',
                )}>
                  <span class="selected">选中</span>
                  {navList.map(item => <span>{item}</span>)}
                </nav>

                <ul class={cn(
                  'scrollbar-hide overflow-auto max-h-[calc(2em_*_12)]',
                  'flex flex-wrap px-.5em py-0 text-22px line-height-2em',
                  'children:(grow-0 shrink-0 w-10%) text-center',
                )}>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                  <li>🐶</li>
                </ul>

              </div>

            </div>

            <div class="m-t-.25em text-12px color-[var(--error-color)]">
              <span>必填</span>
            </div>
          </label>
        </div>

        <p class="tips flex-grow-0 text-center py-1em px-0 min-h-[var(--input-min-height)]">记账时长按即可进行编辑</p>

        <div class="formRow flex-grow-0 mt-0.5em min-h-[var(--input-min-height)]">
          <div class="formValue mt-0.25em">
            <BarButton class="formItem button formItem_value">确定</BarButton>
          </div>
        </div>
      </form>
    )
  },
})
  • 和产品/设计/老板确认样式稿后,留下字句,再开始写代码
  • 添加表单错误提示文字
  • 添加左右滑动样式 nav,并添加去除滚动条样式 &::webkit-scrollbar {display: none;}
    • 使用 unocss 的 rules 配置 scrollbar-hide
    • 或者直接在入口文件 base.scss 添加类样式 .scrollbar-hide {scrollbar-width: none;}
  • 表情列表
    • 使用 emmet 快速创建节点 li{😀}*150
    • 最多显示 10 列 x 12 行
    • 控制行高和高度 line-height-2em max-h-[calc(2em_*_12)]

uno.config.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import { defineConfig, presetAttributify, transformerVariantGroup } from 'unocss'
import {presetWind4} from '@unocss/preset-wind4'

export default defineConfig({
  presets: [
    presetWind4(),
    presetAttributify(),
  ],
  transformers: [
    transformerVariantGroup(), // 支持 where:(a b c) 这种分组写法
  ],
  variants: [
    // where:xxx -> :where(.where\:xxx) { ... },优先级 0,0,0
    (matcher) => {
      if (!matcher.startsWith('where:'))
        return matcher
      return {
        matcher: matcher.slice(6),
        selector: s => `:where(${s})`,
      }
    },
  ],
  theme: {
    colors: {
      // 绑定你的 CSS 变量
      welcomeCardBg: 'var(--welcome-card-bg-color)',
      primaryColor: '#6035BF',
    },
  },
  shortcuts: {
    // 将 UnoCSS 的原子类映射到你 SCSS 里定义好的 .animation-rainbow 类
    'animate-rainbow': 'animation-rainbow',
  },
  rules: [
    [/^scrollbar-hide$/, () => ({
      'scrollbar-width': 'none',
    })],
    [/^scrollbar-default$/, () => ({
      'scrollbar-width': 'auto',
    })],
  ],
})

4. 封装 EmojiSelect 组件(上) ⇧

重构颜文字列表,指定TS类型 ⇧

@src/const/safeEmojiList.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 数据来源: https://unicode.org/emoji/charts/full-emoji-list.html
// index=页面序号, unicode=\u{...} 形式(运行时常量即渲染 emoji),
// emoji=真实emoji字符(来自 full-emoji-list.json 的 unicode 字段), unicode_raw=原始码位, name=CLDR short name
// 注意: \u{...} 为 ES6 转义, 需 tsconfig target >= ES2015

import type { EmojiSubTopic } from '@/const/emojiTopicList.ts'

export interface EmojiItem {
  index: number;
  unicode: string;
  emoji: string;
  unicode_raw: string;
  name: string;
}

export interface EmojiTopic {
  topic: EmojiSubTopic;
  emoji_list: EmojiItem[];
}

export const safeEmojiList: Readonly<EmojiTopic[]> = Object.freeze([
  {
    topic: "face-smiling",
    emoji_list: [
      { index: 1, unicode: "\u{1F600}", emoji: "😀", unicode_raw: "U+1F600", name: "grinning face" },
      { index: 2, unicode: "\u{1F603}", emoji: "😃", unicode_raw: "U+1F603", name: "grinning face with big eyes" },
      { index: 3, unicode: "\u{1F604}", emoji: "😄", unicode_raw: "U+1F604", name: "grinning face with smiling eyes" },
      { index: 4, unicode: "\u{1F601}", emoji: "😁", unicode_raw: "U+1F601", name: "beaming face with smiling eyes" },
      { index: 5, unicode: "\u{1F606}", emoji: "😆", unicode_raw: "U+1F606", name: "grinning squinting face" },
      { index: 6, unicode: "\u{1F605}", emoji: "😅", unicode_raw: "U+1F605", name: "grinning face with sweat" },
      { index: 7, unicode: "\u{1F923}", emoji: "🤣", unicode_raw: "U+1F923", name: "rolling on the floor laughing" },
      { index: 8, unicode: "\u{1F602}", emoji: "😂", unicode_raw: "U+1F602", name: "face with tears of joy" },
      { index: 9, unicode: "\u{1F642}", emoji: "🙂", unicode_raw: "U+1F642", name: "slightly smiling face" },
      { index: 10, unicode: "\u{1F643}", emoji: "🙃", unicode_raw: "U+1F643", name: "upside-down face" },
      { index: 11, unicode: "\u{1FAE0}", emoji: "🫠", unicode_raw: "U+1FAE0", name: "melting face" },
      { index: 12, unicode: "\u{1FAEB}", emoji: "🫫", unicode_raw: "U+1FAEB", name: "⊛ cracking face" },
      { index: 13, unicode: "\u{1F609}", emoji: "😉", unicode_raw: "U+1F609", name: "winking face" },
      { index: 14, unicode: "\u{1F60A}", emoji: "😊", unicode_raw: "U+1F60A", name: "smiling face with smiling eyes" },
      { index: 15, unicode: "\u{1F607}", emoji: "😇", unicode_raw: "U+1F607", name: "smiling face with halo" }
    ],
  },
  /* ... */
] as  const)

添加颜文字主题列表,指定TS类型 ⇧

@/const/emojiTopicList.ts

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
export const emojiTopicList = Object.freeze([
    {
      mainTopic: '表情',
      topics: [
        'face-smiling',
        'face-affection',
        'face-tongue',
        'face-hand',
        'face-neutral-skeptical',
        'face-sleepy',
        'face-unwell',
        'face-hat',
        'face-glasses',
        'face-concerned',
        'face-negative',
        'face-costume',
        'cat-face',
        'monkey-face',
        'heart',
        'emotion',
      ],
    },
    {
      mainTopic: '手势',
      topics: [
        'hand-fingers-open',
        'hand-fingers-partial',
        'hand-single-finger',
        'hand-fingers-closed',
        'hands',
        'hand-prop',
      ],
    },
    {
      mainTopic: '食物',
      topics: [
        'food-fruit',
        'food-vegetable',
        'food-prepared',
        'food-asian',
        'food-sweet',
        'drink',
        'dishware',
      ],
    },
    {
      mainTopic: '动物',
      topics: [
        'animal-mammal',
        'animal-bird',
        'animal-amphibian',
        'animal-reptile',
        'animal-marine',
        'animal-bug',
      ],
    },
    {
      mainTopic: '植物',
      topics: ['plant-flower', 'plant-other'],
    },
    {
      mainTopic: '自然',
      topics: ['time', 'sky & weather'],
    },
    {
      mainTopic: '人物',
      topics: [
        'person',
        'person-gesture',
        'person-fantasy',
        'person-activity',
        'person-resting',
        'family',
        'person-symbol',
      ],
    },
    {
      mainTopic: '场所',
      topics: [
        'place-map',
        'place-geographic',
        'place-building',
        'place-religious',
        'place-other',
        'transport-ground',
        'transport-water',
        'transport-air',
        'hotel',
      ],
    },
    {
      mainTopic: '交通',
      topics: ['transport-sign', 'warning'],
    },
    {
      mainTopic: '节日',
      topics: ['event'],
    },
    {
      mainTopic: '运动',
      topics: ['person-sport', 'sport', 'award-medal'],
    },
    {
      mainTopic: '衣服',
      topics: ['clothing'],
    },
    {
      mainTopic: '文艺',
      topics: [
        'arts & crafts',
        'game',
        'music',
        'musical-instrument',
        'sound',
        'light & video',
        'book-paper',
        'writing',
      ],
    },
    {
      mainTopic: '职业',
      topics: [
        'person-role',
        'money',
        'currency',
        'phone',
        'computer',
        'mail',
        'office',
        'lock',
        'tool',
        'household',
      ],
    },
    {
      mainTopic: '科技',
      topics: ['science', 'medical', 'math'],
    },
    {
      mainTopic: '个人',
      topics: ['body-parts', 'hair-style', 'religion', 'zodiac', 'gender'],
    },
    {
      mainTopic: '其他',
      topics: [
        'other-object',
        'arrow',
        'av-symbol',
        'punctuation',
        'other-symbol',
        'alphanum',
        'flag',
      ],
    },
  ] as const)

export type EmojiMainTopic = (typeof emojiTopicList)[number]['mainTopic']
export type EmojiTopics = (typeof emojiTopicList)[number]['topics']
export type EmojiSubTopic = EmojiTopics[number]

实现颜文字选择器展示表情功能 ⇧

@/modules/tags/EmojiSelector.tsx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import { defineComponent, ref } from 'vue'
import { cn } from 'cn'
import { type EmojiMainTopic, emojiTopicList, type EmojiSubTopic } from '@/const/emojiTopicList.ts'
import { safeEmojiList } from '@/const/safeEmojiList.ts'

export const EmojiSelector = defineComponent({
  name: 'EmojiSelector',
  setup(/* _props, _ctx */) {
    const navList: EmojiMainTopic[] = emojiTopicList
      .map(topicItem => topicItem.mainTopic)
    const selectedMainTopic = ref<EmojiMainTopic>(navList[0] ?? '表情')
    const selectedTopicList: readonly EmojiSubTopic[] = emojiTopicList
      .find(topicItem => topicItem.mainTopic === selectedMainTopic.value)
      ?.topics ?? []
    const flattedTopicEmojiList: string[] = safeEmojiList
      .filter(item => selectedTopicList.includes(item.topic))
      .flatMap(item => item.emoji_list)
      .map(item => item.unicode)

    return () => (
      <div
        class={cn(
          'formItem emojiList error',
          'min-h-[var(--input-min-height)] max-w-full flex-grow-1',
          'b-1 rounded-[var(--input-radius)] text-14px',
          // 动态切换边框颜色 hasError
          Math.random() > 0.5 ? 'b-[var(--input-border-color)]' : 'b-[var(--error-color)]',
        )}>
        <nav
          class={cn(
            'flex flex-nowrap overflow-auto mx-1em py-0 scrollbar-hide',
            '[&>span]:(shrink-0 inline-block p-.5em text-[var(--emoji-nav-text)] whitespace-nowrap)',
            '[&>span.selected]:(text-[var(--emoji-nav-text-selected)] font-bold)',
          )}>
          {navList.map((item) => (
            <span class={item === selectedMainTopic.value ? 'selected' : ''}>
              {item}
            </span>
          ))}
        </nav>

        <ul
          class={cn(
            'scrollbar-hide overflow-auto max-h-[calc(1.5em_*_12)]',
            'flex flex-wrap content-start px-.5em py-0 text-22px line-height-1.5em',
            'children:(grow-0 shrink-0 w-10%) text-center',
          )}>
          {flattedTopicEmojiList.map(unicode => (<li>{unicode}</li>)) }
        </ul>
      </div>
    )
  },
})
  • 展示表情分类导航列表 navList
  • 当前选中的表情主题 selectedMainTopic
  • 选中的合并的分主题列表 selectedTopicList
  • 展示拍平显示的表情列表 flattedTopicEmojiList

5. 封装 EmojiSelect 组件(下) ⇧

添加切换表情主题分类点击切换逻辑,使用计算属性获取表情列表 ⇧

@/modules/tags/EmojiSelector.tsx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import { computed, type ComputedRef, defineComponent, ref } from 'vue'
import { cn } from 'cn'
import { type EmojiMainTopic, emojiTopicList, type EmojiSubTopic } from '@/const/emojiTopicList.ts'
import { safeEmojiList } from '@/const/safeEmojiList.ts'

export const EmojiSelector = defineComponent({
  name: 'EmojiSelector',
  setup(/* _props, _ctx */) {
    const navList: EmojiMainTopic[] = emojiTopicList
      .map(topicItem => topicItem.mainTopic)
    const selectedTopic = ref<EmojiMainTopic>(navList[0] ?? '手势')
    const selectedTopicList: ComputedRef<readonly EmojiSubTopic[]> = computed(() => emojiTopicList
      .find(topicItem => topicItem.mainTopic === selectedTopic.value)
      ?.topics ?? [])
    const selectedEmojiList: ComputedRef<string[]> = computed<string[]>(() => safeEmojiList
      .filter(item => selectedTopicList.value.includes(item.topic))
      .flatMap(item => item.emoji_list)
      .map(item => item.unicode))

    const selectMainTopic = (topic: EmojiMainTopic) => {
      selectedTopic.value = topic
    }
    return () => (
      <div
        class={cn(
          'formItem emojiList error',
          'min-h-[var(--input-min-height)] max-w-full flex-grow-1',
          'b-1 rounded-[var(--input-radius)] text-14px',
          // 动态切换边框颜色 hasError
          Math.random() > 0.5 ? 'b-[var(--input-border-color)]' : 'b-[var(--error-color)]',
        )}>
        <nav
          class={cn(
            'flex flex-nowrap overflow-auto mx-1em py-0 scrollbar-hide',
            '[&>span]:(shrink-0 inline-block p-.5em text-[var(--emoji-nav-text)] whitespace-nowrap)',
            '[&>span.selected]:(text-[var(--emoji-nav-text-selected)] font-bold)',
          )}>
          {navList.map((item) => (
            <span
              onClick={() => selectMainTopic(item)}
              class={item === selectedTopic.value ? 'selected' : ''}>
              {item}
            </span>
          ))}
        </nav>

        <ul
          class={cn(
            'scrollbar-hide overflow-auto h-[calc(1.5em_*_12)]',
            'flex flex-wrap content-start px-.5em py-0 text-22px line-height-1.5em',
            'children:(grow-0 shrink-0 w-10%) text-center',
          )}>
          {selectedEmojiList.value.map(unicode => (<li>{unicode}</li>)) }
        </ul>
      </div>
    )
  },
})
  • 点击切换逻辑 selectMainTopic
  • 使用计算属性类型包裹原类型 ComputedRef<readonly EmojiSubTopic[]>、ComputedRef<string[]>

使用 v-model 颜文字选择器组件绑定表情字符串数据 ⇧

@/modules/tags/EmojiSelector.tsx

  • 颜文字选择器组件功能
    • 渲染颜文字主题导航列表
    • 渲染颜文字列表
    • 切换选择颜文字主题
    • 切换选择颜文字表情
    • 抛出颜文字表情表更事件
  • 外部组件使用 v-model 绑定颜文字表情数据

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    
    import { computed, type ComputedRef, defineComponent, ref } from 'vue'
    import { cn } from 'cn'
    import { type EmojiMainTopic, emojiTopicList, type EmojiSubTopic } from '@/const/emojiTopicList.ts'
    import { safeEmojiList } from '@/const/safeEmojiList.ts'
    
    export const EmojiSelector = defineComponent({
    name: 'EmojiSelector',
    emits: ['update:emoji',],
    setup( _props, _ctx ) {
    const navList: EmojiMainTopic[] = emojiTopicList
      .map(topicItem => topicItem.mainTopic)
    const selectedTopic = ref<EmojiMainTopic>(navList[0] ?? '手势')
    const selectedTopicList: ComputedRef<readonly EmojiSubTopic[]> = computed(() => /* ... */)
    const selectedEmojiList: ComputedRef<string[]> = computed<string[]>(() => /* ... */)
    const selectedEmoji = ref('')
    
    const selectMainTopic = (topic: EmojiMainTopic) => {
      selectedEmoji.value = ''
      _ctx.emit('update:emoji', '')
      selectedTopic.value = topic
    }
    
    const selectEmoji = (unicode: string) => {
      selectedEmoji.value = unicode
      _ctx.emit('update:emoji', unicode)
    }
    return () => (
      <div
        class={cn(/* ... */)}>
        <nav
          class={cn(/* ... */)}>
          {navList.map((item) => (
            <span
              onClick={() => selectMainTopic(item)}
              class={item === selectedTopic.value ? 'selected' : ''}>
              {item}
            </span>
          ))}
        </nav>
    
        <ul
          class={cn(
            'scrollbar-hide overflow-auto h-[calc(1.6em_*_12)]',
            'flex flex-wrap content-start px-.5em py-0 ',
            'text-center text-22px line-height-1.5em',
            'children:(grow-0 shrink-0 w-10% b-1 b-transparent) ',
            '[&>li.selected]:(bg-blue-300)',
          )}>
          {
            selectedEmojiList.value
              .map(unicode => (
                <li
                  onClick={() => selectEmoji(unicode)}
                  class={unicode === selectedEmoji.value ? 'selected' : ''}>
                  {unicode}
                </li>
              ))
          }
        </ul>
      </div>
    )
    },
    })
    
  • 子组件注册发布事件 emits: ['update:emoji',],

  • 子组件触发事件逻辑 _ctx.emit('update:emoji', unicode)

  • 父组件在子组件节点上添加 v-model:emoji={响应式数据变量}

@/modules/tags/TagForm.tsx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { defineComponent, reactive } from 'vue'
import { BarButton } from '@/components/BarButton.tsx'
import { cn } from 'cn'
import { EmojiSelector } from '@/modules/tags/EmojiSelector.tsx'

export const TagForm = defineComponent({
  name: 'TagForm',
  setup(/* _props, _ctx */) {
    const formData = reactive({
      name: '',
      sign: '',
    })
    return () => (
      <form class="form p-1em min-h-720px h-full">
        <div class="formRow mt-0.5em flex-grow-0">
          <label for="tag-name">
            <span class="formItem_name">标签名称</span>
            <div class="formItem_value flex mt-0.25em">
              <input
                id="tag-name"
                v-model={formData.name}
                class={cn(/* ... */)}
              />
            </div>
            <div class="m-t-.25em text-12px color-[var(--error-color)]">
              <span>必填</span>
            </div>
          </label>
        </div>

        <div class="formRow mt-0.5em">
          <label class="flex flex-col">
            <span class="formItem_name">
              符号 {formData.sign}
            </span>

            <div class={cn('formValue', 'flex mt-0.25em')}>
              <EmojiSelector v-model:emoji={formData.sign} />
            </div>

            <div class="m-t-.25em text-12px color-[var(--error-color)]">
              <span>必填</span>
            </div>
          </label>
        </div>

        <p class="tips flex-grow-0 text-center py-1em px-0 min-h-[var(--input-min-height)]">
          记账时长按即可进行编辑
        </p>

        <div class="formRow flex-grow-0 mt-0.5em min-h-[var(--input-min-height)]">
          <div class="formValue mt-0.25em">
            <BarButton class="formItem button formItem_value">确定</BarButton>
          </div>
        </div>
      </form>
    )
  },
})
  • v-model 有多种绑定形式
    • 子组件声明默认外部数据名称 props:{ modelValue: {type: String, /* ... */}, }
    • 子组件触发事件 update:modelValue
    • 父组件在子组件节点上绑定响应式数据 :modelValue={xxx}
    • 子组件声明发布事件名称,以 'update:xxx' 的格式
    • 子组件触发事件 update:xxx
    • 父组件在子组件节点上绑定响应式数据 v-model:xxx={xXxx}

参考


macOS 和 iOS 无法显示部分表情

  • 这应该是因为 macOS 和 iOS 使用的 Unicode 并不是最新版 v14,而我的 emoji 是来自 Unicode v14 的。
  • 解决办法是使用旧版 Unicode,比如 Unicode V13 或 Unicode V12 的 emoji。

这是 Unicode v13 里的 emoji,数量比 v14 要少:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
type EmojiList = [string, string[]][];
export const emojiList: EmojiList = [
  ["face-smiling", ["\u{1F600}", "\u{1F603}", "\u{1F604}", "\u{1F601}", "\u{1F606}", "\u{1F605}", "\u{1F923}", "\u{1F602}", "\u{1F642}", "\u{1F643}", "\u{1F609}", "\u{1F60A}", "\u{1F607}",],],
  ["face-affection", ["\u{1F970}", "\u{1F60D}", "\u{1F929}", "\u{1F618}", "\u{1F617}", "\u{263A}", "\u{1F61A}", "\u{1F619}",],],
  ["face-tongue", ["\u{1F60B}", "\u{1F61B}", "\u{1F61C}", "\u{1F92A}", "\u{1F61D}", "\u{1F911}",],],
  ["face-hand", ["\u{1F917}", "\u{1F92D}", "\u{1F92B}", "\u{1F914}"]],
  ["face-neutral-skeptical", ["\u{1F910}", "\u{1F928}", "\u{1F610}", "\u{1F611}", "\u{1F636}", "\u{1F60F}", "\u{1F612}", "\u{1F644}", "\u{1F62C}", "\u{1F925}",],],
  ["face-sleepy", ["\u{1F60C}", "\u{1F614}", "\u{1F62A}", "\u{1F924}", "\u{1F634}"],],
  ["face-unwell", ["\u{1F637}", "\u{1F912}", "\u{1F915}", "\u{1F922}", "\u{1F92E}", "\u{1F927}", "\u{1F975}", "\u{1F976}", "\u{1F974}", "\u{1F635}", "\u{1F92F}",],],
  ["face-hat", ["\u{1F920}", "\u{1F973}"]],
  ["face-glasses", ["\u{1F60E}", "\u{1F913}", "\u{1F9D0}"]],
  ["face-concerned", ["\u{1F615}", "\u{1F61F}", "\u{1F641}", "\u{2639}", "\u{1F62E}", "\u{1F62F}", "\u{1F632}", "\u{1F633}", "\u{1F97A}", "\u{1F626}", "\u{1F627}", "\u{1F628}", "\u{1F630}", "\u{1F625}", "\u{1F622}", "\u{1F62D}", "\u{1F631}", "\u{1F616}", "\u{1F623}", "\u{1F61E}", "\u{1F613}", "\u{1F629}", "\u{1F62B}", "\u{1F971}",],],
  ["face-negative", ["\u{1F624}", "\u{1F621}", "\u{1F620}", "\u{1F92C}", "\u{1F608}", "\u{1F47F}", "\u{1F480}", "\u{2620}",],],
  ["face-costume", ["\u{1F4A9}", "\u{1F921}", "\u{1F479}", "\u{1F47A}", "\u{1F47B}", "\u{1F47D}", "\u{1F47E}", "\u{1F916}",],],
  ["cat-face", ["\u{1F63A}", "\u{1F638}", "\u{1F639}", "\u{1F63B}", "\u{1F63C}", "\u{1F63D}", "\u{1F640}", "\u{1F63F}", "\u{1F63E}",],],
  ["monkey-face", ["\u{1F648}", "\u{1F649}", "\u{1F64A}"]],
  ["emotion", ["\u{1F48B}", "\u{1F48C}", "\u{1F498}", "\u{1F49D}", "\u{1F496}", "\u{1F497}", "\u{1F493}", "\u{1F49E}", "\u{1F495}", "\u{1F49F}", "\u{2763}", "\u{1F494}", "\u{2764}", "\u{1F9E1}", "\u{1F49B}", "\u{1F49A}", "\u{1F499}", "\u{1F49C}", "\u{1F90E}", "\u{1F5A4}", "\u{1F90D}", "\u{1F4AF}", "\u{1F4A2}", "\u{1F4A5}", "\u{1F4AB}", "\u{1F4A6}", "\u{1F4A8}", "\u{1F573}", "\u{1F4A3}", "\u{1F4AC}", "\u{1F441}\u{FE0F}\u{200D}\u{1F5E8}\u{FE0F}", "\u{1F5E8}", "\u{1F5EF}", "\u{1F4AD}", "\u{1F4A4}",],],
  ["hand-fingers-open", ["\u{1F44B}", "\u{1F91A}", "\u{1F590}", "\u{270B}", "\u{1F596}"],],
  ["hand-fingers-partial", ["\u{1F44C}", "\u{1F90F}", "\u{270C}", "\u{1F91E}", "\u{1F91F}", "\u{1F918}", "\u{1F919}",],],
  ["hand-single-finger", ["\u{1F448}", "\u{1F449}", "\u{1F446}", "\u{1F595}", "\u{1F447}", "\u{261D}",],],
  ["hand-fingers-closed", ["\u{1F44D}", "\u{1F44E}", "\u{270A}", "\u{1F44A}", "\u{1F91B}", "\u{1F91C}",],],
  ["hands", ["\u{1F44F}", "\u{1F64C}", "\u{1F450}", "\u{1F932}", "\u{1F91D}", "\u{1F64F}",],],
  ["hand-prop", ["\u{270D}", "\u{1F485}", "\u{1F933}"]],
  ["body-parts", ["\u{1F4AA}", "\u{1F9BE}", "\u{1F9BF}", "\u{1F9B5}", "\u{1F9B6}", "\u{1F442}", "\u{1F9BB}", "\u{1F443}", "\u{1F9E0}", "\u{1F9B7}", "\u{1F9B4}", "\u{1F440}", "\u{1F441}", "\u{1F445}", "\u{1F444}",],],
  ["person", ["\u{1F476}", "\u{1F9D2}", "\u{1F466}", "\u{1F467}", "\u{1F9D1}", "\u{1F471}", "\u{1F468}", "\u{1F9D4}", "\u{1F468}\u{200D}\u{1F9B0}", "\u{1F468}\u{200D}\u{1F9B1}", "\u{1F468}\u{200D}\u{1F9B3}", "\u{1F468}\u{200D}\u{1F9B2}", "\u{1F469}", "\u{1F469}\u{200D}\u{1F9B0}", "\u{1F9D1}\u{200D}\u{1F9B0}", "\u{1F469}\u{200D}\u{1F9B1}", "\u{1F9D1}\u{200D}\u{1F9B1}", "\u{1F469}\u{200D}\u{1F9B3}", "\u{1F9D1}\u{200D}\u{1F9B3}", "\u{1F469}\u{200D}\u{1F9B2}", "\u{1F9D1}\u{200D}\u{1F9B2}", "\u{1F471}\u{200D}\u{2640}\u{FE0F}", "\u{1F471}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D3}", "\u{1F474}", "\u{1F475}",],],
  ["person-gesture", ["\u{1F64D}", "\u{1F64D}\u{200D}\u{2642}\u{FE0F}", "\u{1F64D}\u{200D}\u{2640}\u{FE0F}", "\u{1F64E}", "\u{1F64E}\u{200D}\u{2642}\u{FE0F}", "\u{1F64E}\u{200D}\u{2640}\u{FE0F}", "\u{1F645}", "\u{1F645}\u{200D}\u{2642}\u{FE0F}", "\u{1F645}\u{200D}\u{2640}\u{FE0F}", "\u{1F646}", "\u{1F646}\u{200D}\u{2642}\u{FE0F}", "\u{1F646}\u{200D}\u{2640}\u{FE0F}", "\u{1F481}", "\u{1F481}\u{200D}\u{2642}\u{FE0F}", "\u{1F481}\u{200D}\u{2640}\u{FE0F}", "\u{1F64B}", "\u{1F64B}\u{200D}\u{2642}\u{FE0F}", "\u{1F64B}\u{200D}\u{2640}\u{FE0F}", "\u{1F9CF}", "\u{1F9CF}\u{200D}\u{2642}\u{FE0F}", "\u{1F9CF}\u{200D}\u{2640}\u{FE0F}", "\u{1F647}", "\u{1F647}\u{200D}\u{2642}\u{FE0F}", "\u{1F647}\u{200D}\u{2640}\u{FE0F}", "\u{1F926}", "\u{1F926}\u{200D}\u{2642}\u{FE0F}", "\u{1F926}\u{200D}\u{2640}\u{FE0F}", "\u{1F937}", "\u{1F937}\u{200D}\u{2642}\u{FE0F}", "\u{1F937}\u{200D}\u{2640}\u{FE0F}",],],
  ["person-role", ["\u{1F9D1}\u{200D}\u{2695}\u{FE0F}", "\u{1F468}\u{200D}\u{2695}\u{FE0F}", "\u{1F469}\u{200D}\u{2695}\u{FE0F}", "\u{1F9D1}\u{200D}\u{1F393}", "\u{1F468}\u{200D}\u{1F393}", "\u{1F469}\u{200D}\u{1F393}", "\u{1F9D1}\u{200D}\u{1F3EB}", "\u{1F468}\u{200D}\u{1F3EB}", "\u{1F469}\u{200D}\u{1F3EB}", "\u{1F9D1}\u{200D}\u{2696}\u{FE0F}", "\u{1F468}\u{200D}\u{2696}\u{FE0F}", "\u{1F469}\u{200D}\u{2696}\u{FE0F}", "\u{1F9D1}\u{200D}\u{1F33E}", "\u{1F468}\u{200D}\u{1F33E}", "\u{1F469}\u{200D}\u{1F33E}", "\u{1F9D1}\u{200D}\u{1F373}", "\u{1F468}\u{200D}\u{1F373}", "\u{1F469}\u{200D}\u{1F373}", "\u{1F9D1}\u{200D}\u{1F527}", "\u{1F468}\u{200D}\u{1F527}", "\u{1F469}\u{200D}\u{1F527}", "\u{1F9D1}\u{200D}\u{1F3ED}", "\u{1F468}\u{200D}\u{1F3ED}", "\u{1F469}\u{200D}\u{1F3ED}", "\u{1F9D1}\u{200D}\u{1F4BC}", "\u{1F468}\u{200D}\u{1F4BC}", "\u{1F469}\u{200D}\u{1F4BC}", "\u{1F9D1}\u{200D}\u{1F52C}", "\u{1F468}\u{200D}\u{1F52C}", "\u{1F469}\u{200D}\u{1F52C}", "\u{1F9D1}\u{200D}\u{1F4BB}", "\u{1F468}\u{200D}\u{1F4BB}", "\u{1F469}\u{200D}\u{1F4BB}", "\u{1F9D1}\u{200D}\u{1F3A4}", "\u{1F468}\u{200D}\u{1F3A4}", "\u{1F469}\u{200D}\u{1F3A4}", "\u{1F9D1}\u{200D}\u{1F3A8}", "\u{1F468}\u{200D}\u{1F3A8}", "\u{1F469}\u{200D}\u{1F3A8}", "\u{1F9D1}\u{200D}\u{2708}\u{FE0F}", "\u{1F468}\u{200D}\u{2708}\u{FE0F}", "\u{1F469}\u{200D}\u{2708}\u{FE0F}", "\u{1F9D1}\u{200D}\u{1F680}", "\u{1F468}\u{200D}\u{1F680}", "\u{1F469}\u{200D}\u{1F680}", "\u{1F9D1}\u{200D}\u{1F692}", "\u{1F468}\u{200D}\u{1F692}", "\u{1F469}\u{200D}\u{1F692}", "\u{1F46E}", "\u{1F46E}\u{200D}\u{2642}\u{FE0F}", "\u{1F46E}\u{200D}\u{2640}\u{FE0F}", "\u{1F575}", "\u{1F575}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", "\u{1F575}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", "\u{1F482}", "\u{1F482}\u{200D}\u{2642}\u{FE0F}", "\u{1F482}\u{200D}\u{2640}\u{FE0F}", "\u{1F477}", "\u{1F477}\u{200D}\u{2642}\u{FE0F}", "\u{1F477}\u{200D}\u{2640}\u{FE0F}", "\u{1F934}", "\u{1F478}", "\u{1F473}", "\u{1F473}\u{200D}\u{2642}\u{FE0F}", "\u{1F473}\u{200D}\u{2640}\u{FE0F}", "\u{1F472}", "\u{1F9D5}", "\u{1F935}", "\u{1F470}", "\u{1F930}", "\u{1F931}",],],
  ["person-fantasy", ["\u{1F47C}", "\u{1F385}", "\u{1F936}", "\u{1F9B8}", "\u{1F9B8}\u{200D}\u{2642}\u{FE0F}", "\u{1F9B8}\u{200D}\u{2640}\u{FE0F}", "\u{1F9B9}", "\u{1F9B9}\u{200D}\u{2642}\u{FE0F}", "\u{1F9B9}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D9}", "\u{1F9D9}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D9}\u{200D}\u{2640}\u{FE0F}", "\u{1F9DA}", "\u{1F9DA}\u{200D}\u{2642}\u{FE0F}", "\u{1F9DA}\u{200D}\u{2640}\u{FE0F}", "\u{1F9DB}", "\u{1F9DB}\u{200D}\u{2642}\u{FE0F}", "\u{1F9DB}\u{200D}\u{2640}\u{FE0F}", "\u{1F9DC}", "\u{1F9DC}\u{200D}\u{2642}\u{FE0F}", "\u{1F9DC}\u{200D}\u{2640}\u{FE0F}", "\u{1F9DD}", "\u{1F9DD}\u{200D}\u{2642}\u{FE0F}", "\u{1F9DD}\u{200D}\u{2640}\u{FE0F}", "\u{1F9DE}", "\u{1F9DE}\u{200D}\u{2642}\u{FE0F}", "\u{1F9DE}\u{200D}\u{2640}\u{FE0F}", "\u{1F9DF}", "\u{1F9DF}\u{200D}\u{2642}\u{FE0F}", "\u{1F9DF}\u{200D}\u{2640}\u{FE0F}",],],
  ["person-activity", ["\u{1F486}", "\u{1F486}\u{200D}\u{2642}\u{FE0F}", "\u{1F486}\u{200D}\u{2640}\u{FE0F}", "\u{1F487}", "\u{1F487}\u{200D}\u{2642}\u{FE0F}", "\u{1F487}\u{200D}\u{2640}\u{FE0F}", "\u{1F6B6}", "\u{1F6B6}\u{200D}\u{2642}\u{FE0F}", "\u{1F6B6}\u{200D}\u{2640}\u{FE0F}", "\u{1F9CD}", "\u{1F9CD}\u{200D}\u{2642}\u{FE0F}", "\u{1F9CD}\u{200D}\u{2640}\u{FE0F}", "\u{1F9CE}", "\u{1F9CE}\u{200D}\u{2642}\u{FE0F}", "\u{1F9CE}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D1}\u{200D}\u{1F9AF}", "\u{1F468}\u{200D}\u{1F9AF}", "\u{1F469}\u{200D}\u{1F9AF}", "\u{1F9D1}\u{200D}\u{1F9BC}", "\u{1F468}\u{200D}\u{1F9BC}", "\u{1F469}\u{200D}\u{1F9BC}", "\u{1F9D1}\u{200D}\u{1F9BD}", "\u{1F468}\u{200D}\u{1F9BD}", "\u{1F469}\u{200D}\u{1F9BD}", "\u{1F3C3}", "\u{1F3C3}\u{200D}\u{2642}\u{FE0F}", "\u{1F3C3}\u{200D}\u{2640}\u{FE0F}", "\u{1F483}", "\u{1F57A}", "\u{1F574}", "\u{1F46F}", "\u{1F46F}\u{200D}\u{2642}\u{FE0F}", "\u{1F46F}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D6}", "\u{1F9D6}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D6}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D7}", "\u{1F9D7}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D7}\u{200D}\u{2640}\u{FE0F}",],],
  ["person-sport", ["\u{1F93A}", "\u{1F3C7}", "\u{26F7}", "\u{1F3C2}", "\u{1F3CC}", "\u{1F3CC}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", "\u{1F3CC}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", "\u{1F3C4}", "\u{1F3C4}\u{200D}\u{2642}\u{FE0F}", "\u{1F3C4}\u{200D}\u{2640}\u{FE0F}", "\u{1F6A3}", "\u{1F6A3}\u{200D}\u{2642}\u{FE0F}", "\u{1F6A3}\u{200D}\u{2640}\u{FE0F}", "\u{1F3CA}", "\u{1F3CA}\u{200D}\u{2642}\u{FE0F}", "\u{1F3CA}\u{200D}\u{2640}\u{FE0F}", "\u{26F9}", "\u{26F9}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", "\u{26F9}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", "\u{1F3CB}", "\u{1F3CB}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", "\u{1F3CB}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", "\u{1F6B4}", "\u{1F6B4}\u{200D}\u{2642}\u{FE0F}", "\u{1F6B4}\u{200D}\u{2640}\u{FE0F}", "\u{1F6B5}", "\u{1F6B5}\u{200D}\u{2642}\u{FE0F}", "\u{1F6B5}\u{200D}\u{2640}\u{FE0F}", "\u{1F938}", "\u{1F938}\u{200D}\u{2642}\u{FE0F}", "\u{1F938}\u{200D}\u{2640}\u{FE0F}", "\u{1F93C}", "\u{1F93C}\u{200D}\u{2642}\u{FE0F}", "\u{1F93C}\u{200D}\u{2640}\u{FE0F}", "\u{1F93D}", "\u{1F93D}\u{200D}\u{2642}\u{FE0F}", "\u{1F93D}\u{200D}\u{2640}\u{FE0F}", "\u{1F93E}", "\u{1F93E}\u{200D}\u{2642}\u{FE0F}", "\u{1F93E}\u{200D}\u{2640}\u{FE0F}", "\u{1F939}", "\u{1F939}\u{200D}\u{2642}\u{FE0F}", "\u{1F939}\u{200D}\u{2640}\u{FE0F}",],],
  ["person-resting", ["\u{1F9D8}", "\u{1F9D8}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D8}\u{200D}\u{2640}\u{FE0F}", "\u{1F6C0}", "\u{1F6CC}",],],
  ["family", ["\u{1F9D1}\u{200D}\u{1F91D}\u{200D}\u{1F9D1}", "\u{1F46D}", "\u{1F46B}", "\u{1F46C}", "\u{1F48F}", "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}", "\u{1F468}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F468}", "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F48B}\u{200D}\u{1F469}", "\u{1F491}", "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}", "\u{1F468}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F468}", "\u{1F469}\u{200D}\u{2764}\u{FE0F}\u{200D}\u{1F469}", "\u{1F46A}", "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}", "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}", "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}", "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F466}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F467}", "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F466}", "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}", "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}", "\u{1F468}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F466}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F467}", "\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F466}", "\u{1F468}\u{200D}\u{1F467}\u{200D}\u{1F467}", "\u{1F469}\u{200D}\u{1F466}", "\u{1F469}\u{200D}\u{1F466}\u{200D}\u{1F466}", "\u{1F469}\u{200D}\u{1F467}", "\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}", "\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F467}",],],
  ["person-symbol", ["\u{1F5E3}", "\u{1F464}", "\u{1F465}", "\u{1F463}"]],
  ["hair-style", ["\u{1F9B0}", "\u{1F9B1}", "\u{1F9B3}", "\u{1F9B2}"]],
  ["animal-mammal", ["\u{1F435}", "\u{1F412}", "\u{1F98D}", "\u{1F9A7}", "\u{1F436}", "\u{1F415}", "\u{1F9AE}", "\u{1F415}\u{200D}\u{1F9BA}", "\u{1F429}", "\u{1F43A}", "\u{1F98A}", "\u{1F99D}", "\u{1F431}", "\u{1F408}", "\u{1F981}", "\u{1F42F}", "\u{1F405}", "\u{1F406}", "\u{1F434}", "\u{1F40E}", "\u{1F984}", "\u{1F993}", "\u{1F98C}", "\u{1F42E}", "\u{1F402}", "\u{1F403}", "\u{1F404}", "\u{1F437}", "\u{1F416}", "\u{1F417}", "\u{1F43D}", "\u{1F40F}", "\u{1F411}", "\u{1F410}", "\u{1F42A}", "\u{1F42B}", "\u{1F999}", "\u{1F992}", "\u{1F418}", "\u{1F98F}", "\u{1F99B}", "\u{1F42D}", "\u{1F401}", "\u{1F400}", "\u{1F439}", "\u{1F430}", "\u{1F407}", "\u{1F43F}", "\u{1F994}", "\u{1F987}", "\u{1F43B}", "\u{1F428}", "\u{1F43C}", "\u{1F9A5}", "\u{1F9A6}", "\u{1F9A8}", "\u{1F998}", "\u{1F9A1}", "\u{1F43E}",],],
  ["animal-bird", ["\u{1F983}", "\u{1F414}", "\u{1F413}", "\u{1F423}", "\u{1F424}", "\u{1F425}", "\u{1F426}", "\u{1F427}", "\u{1F54A}", "\u{1F985}", "\u{1F986}", "\u{1F9A2}", "\u{1F989}", "\u{1F9A9}", "\u{1F99A}", "\u{1F99C}",],],
  ["animal-amphibian", ["\u{1F438}"]],
  ["animal-reptile", ["\u{1F40A}", "\u{1F422}", "\u{1F98E}", "\u{1F40D}", "\u{1F432}", "\u{1F409}", "\u{1F995}", "\u{1F996}",],],
  ["animal-marine", ["\u{1F433}", "\u{1F40B}", "\u{1F42C}", "\u{1F41F}", "\u{1F420}", "\u{1F421}", "\u{1F988}", "\u{1F419}", "\u{1F41A}",],],
  ["animal-bug", ["\u{1F40C}", "\u{1F98B}", "\u{1F41B}", "\u{1F41C}", "\u{1F41D}", "\u{1F41E}", "\u{1F997}", "\u{1F577}", "\u{1F578}", "\u{1F982}", "\u{1F99F}", "\u{1F9A0}",],],
  ["plant-flower", ["\u{1F490}", "\u{1F338}", "\u{1F4AE}", "\u{1F3F5}", "\u{1F339}", "\u{1F940}", "\u{1F33A}", "\u{1F33B}", "\u{1F33C}", "\u{1F337}",],],
  ["plant-other", ["\u{1F331}", "\u{1F332}", "\u{1F333}", "\u{1F334}", "\u{1F335}", "\u{1F33E}", "\u{1F33F}", "\u{2618}", "\u{1F340}", "\u{1F341}", "\u{1F342}", "\u{1F343}",],],
  ["food-fruit", ["\u{1F347}", "\u{1F348}", "\u{1F349}", "\u{1F34A}", "\u{1F34B}", "\u{1F34C}", "\u{1F34D}", "\u{1F96D}", "\u{1F34E}", "\u{1F34F}", "\u{1F350}", "\u{1F351}", "\u{1F352}", "\u{1F353}", "\u{1F95D}", "\u{1F345}", "\u{1F965}",],],
  ["food-vegetable", ["\u{1F951}", "\u{1F346}", "\u{1F954}", "\u{1F955}", "\u{1F33D}", "\u{1F336}", "\u{1F952}", "\u{1F96C}", "\u{1F966}", "\u{1F9C4}", "\u{1F9C5}", "\u{1F344}", "\u{1F95C}", "\u{1F330}",],],
  ["food-prepared", ["\u{1F35E}", "\u{1F950}", "\u{1F956}", "\u{1FAD3}", "\u{1F968}", "\u{1F96F}", "\u{1F95E}", "\u{1F9C7}", "\u{1F9C0}", "\u{1F356}", "\u{1F357}", "\u{1F969}", "\u{1F953}", "\u{1F354}", "\u{1F35F}", "\u{1F355}", "\u{1F32D}", "\u{1F96A}", "\u{1F32E}", "\u{1F32F}", "\u{1F959}", "\u{1F9C6}", "\u{1F95A}", "\u{1F373}", "\u{1F958}", "\u{1F372}", "\u{1FAD5}", "\u{1F957}", "\u{1F37F}", "\u{1F9C8}", "\u{1F9C2}", "\u{1F96B}",],],
  ["food-asian", ["\u{1F371}", "\u{1F358}", "\u{1F359}", "\u{1F35A}", "\u{1F35B}", "\u{1F35C}", "\u{1F35D}", "\u{1F360}", "\u{1F362}", "\u{1F363}", "\u{1F364}", "\u{1F365}", "\u{1F96E}", "\u{1F361}", "\u{1F95F}", "\u{1F960}", "\u{1F961}",],],
  ["food-marine", ["\u{1F980}", "\u{1F99E}", "\u{1F990}", "\u{1F991}", "\u{1F9AA}"],],
  ["food-sweet", ["\u{1F366}", "\u{1F367}", "\u{1F368}", "\u{1F369}", "\u{1F36A}", "\u{1F382}", "\u{1F370}", "\u{1F9C1}", "\u{1F967}", "\u{1F36B}", "\u{1F36C}", "\u{1F36D}", "\u{1F36E}", "\u{1F36F}",],],
  ["drink", ["\u{1F37C}", "\u{1F95B}", "\u{2615}", "\u{1F375}", "\u{1F376}", "\u{1F37E}", "\u{1F377}", "\u{1F378}", "\u{1F379}", "\u{1F37A}", "\u{1F37B}", "\u{1F942}", "\u{1F943}", "\u{1F964}", "\u{1F9CB}", "\u{1F9C3}", "\u{1F9C9}", "\u{1F9CA}",],],
  ["dishware", ["\u{1F962}", "\u{1F37D}", "\u{1F374}", "\u{1F944}", "\u{1F52A}", "\u{1F3FA}",],],
  ["place-map", ["\u{1F30D}", "\u{1F30E}", "\u{1F30F}", "\u{1F310}", "\u{1F5FA}", "\u{1F5FE}", "\u{1F9ED}",],],
  ["place-geographic", ["\u{1F3D4}", "\u{26F0}", "\u{1F30B}", "\u{1F5FB}", "\u{1F3D5}", "\u{1F3D6}", "\u{1F3DC}", "\u{1F3DD}", "\u{1F3DE}",],],
  ["place-building", ["\u{1F3DF}", "\u{1F3DB}", "\u{1F3D7}", "\u{1F9F1}", "\u{1FAA8}", "\u{1F3D8}", "\u{1F3DA}", "\u{1F3E0}", "\u{1F3E1}", "\u{1F3E2}", "\u{1F3E3}", "\u{1F3E4}", "\u{1F3E5}", "\u{1F3E6}", "\u{1F3E8}", "\u{1F3E9}", "\u{1F3EA}", "\u{1F3EB}", "\u{1F3EC}", "\u{1F3ED}", "\u{1F3EF}", "\u{1F3F0}", "\u{1F492}", "\u{1F5FC}", "\u{1F5FD}",],],
  ["place-religious", ["\u{26EA}", "\u{1F54C}", "\u{1F6D5}", "\u{1F54D}", "\u{26E9}", "\u{1F54B}",],],
  ["place-other", ["\u{26F2}", "\u{26FA}", "\u{1F301}", "\u{1F303}", "\u{1F3D9}", "\u{1F304}", "\u{1F305}", "\u{1F306}", "\u{1F307}", "\u{1F309}", "\u{2668}", "\u{1F3A0}", "\u{1F3A1}", "\u{1F3A2}", "\u{1F488}", "\u{1F3AA}",],],
  ["transport-ground", ["\u{1F682}", "\u{1F683}", "\u{1F684}", "\u{1F685}", "\u{1F686}", "\u{1F687}", "\u{1F688}", "\u{1F689}", "\u{1F68A}", "\u{1F69D}", "\u{1F69E}", "\u{1F68B}", "\u{1F68C}", "\u{1F68D}", "\u{1F68E}", "\u{1F690}", "\u{1F691}", "\u{1F692}", "\u{1F693}", "\u{1F694}", "\u{1F695}", "\u{1F696}", "\u{1F697}", "\u{1F698}", "\u{1F699}", "\u{1F69A}", "\u{1F69B}", "\u{1F69C}", "\u{1F3CE}", "\u{1F3CD}", "\u{1F6F5}", "\u{1F9BD}", "\u{1F9BC}", "\u{1F6FA}", "\u{1F6B2}", "\u{1F6F4}", "\u{1F6F9}", "\u{1F6FC}", "\u{1F68F}", "\u{1F6E3}", "\u{1F6E4}", "\u{1F6E2}", "\u{26FD}", "\u{1F6A8}", "\u{1F6A5}", "\u{1F6A6}", "\u{1F6D1}", "\u{1F6A7}",],],
  ["transport-water", ["\u{2693}", "\u{26F5}", "\u{1F6F6}", "\u{1F6A4}", "\u{1F6F3}", "\u{26F4}", "\u{1F6E5}", "\u{1F6A2}",],],
  ["transport-air", ["\u{2708}", "\u{1F6E9}", "\u{1F6EB}", "\u{1F6EC}", "\u{1FA82}", "\u{1F4BA}", "\u{1F681}", "\u{1F69F}", "\u{1F6A0}", "\u{1F6A1}", "\u{1F6F0}", "\u{1F680}", "\u{1F6F8}",],],
  ["hotel", ["\u{1F6CE}", "\u{1F9F3}"]],
  ["time", ["\u{231B}", "\u{23F3}", "\u{231A}", "\u{23F0}", "\u{23F1}", "\u{23F2}", "\u{1F570}", "\u{1F55B}", "\u{1F567}", "\u{1F550}", "\u{1F55C}", "\u{1F551}", "\u{1F55D}", "\u{1F552}", "\u{1F55E}", "\u{1F553}", "\u{1F55F}", "\u{1F554}", "\u{1F560}", "\u{1F555}", "\u{1F561}", "\u{1F556}", "\u{1F562}", "\u{1F557}", "\u{1F563}", "\u{1F558}", "\u{1F564}", "\u{1F559}", "\u{1F565}", "\u{1F55A}", "\u{1F566}",],],
  ["sky & weather", ["\u{1F311}", "\u{1F312}", "\u{1F313}", "\u{1F314}", "\u{1F315}", "\u{1F316}", "\u{1F317}", "\u{1F318}", "\u{1F319}", "\u{1F31A}", "\u{1F31B}", "\u{1F31C}", "\u{1F321}", "\u{2600}", "\u{1F31D}", "\u{1F31E}", "\u{1FA90}", "\u{2B50}", "\u{1F31F}", "\u{1F320}", "\u{1F30C}", "\u{2601}", "\u{26C5}", "\u{26C8}", "\u{1F324}", "\u{1F325}", "\u{1F326}", "\u{1F327}", "\u{1F328}", "\u{1F329}", "\u{1F32A}", "\u{1F32B}", "\u{1F32C}", "\u{1F300}", "\u{1F308}", "\u{1F302}", "\u{2602}", "\u{2614}", "\u{26F1}", "\u{26A1}", "\u{2744}", "\u{2603}", "\u{26C4}", "\u{2604}", "\u{1F525}", "\u{1F4A7}", "\u{1F30A}",],],
  ["event", ["\u{1F383}", "\u{1F384}", "\u{1F386}", "\u{1F387}", "\u{1F9E8}", "\u{2728}", "\u{1F388}", "\u{1F389}", "\u{1F38A}", "\u{1F38B}", "\u{1F38D}", "\u{1F38E}", "\u{1F38F}", "\u{1F390}", "\u{1F391}", "\u{1F9E7}", "\u{1F380}", "\u{1F381}", "\u{1F397}", "\u{1F39F}", "\u{1F3AB}",],],
  ["award-medal", ["\u{1F396}", "\u{1F3C6}", "\u{1F3C5}", "\u{1F947}", "\u{1F948}", "\u{1F949}",],],
  ["sport", ["\u{26BD}", "\u{26BE}", "\u{1F94E}", "\u{1F3C0}", "\u{1F3D0}", "\u{1F3C8}", "\u{1F3C9}", "\u{1F3BE}", "\u{1F94F}", "\u{1F3B3}", "\u{1F3CF}", "\u{1F3D1}", "\u{1F3D2}", "\u{1F94D}", "\u{1F3D3}", "\u{1F3F8}", "\u{1F94A}", "\u{1F94B}", "\u{1F945}", "\u{26F3}", "\u{26F8}", "\u{1F3A3}", "\u{1F93F}", "\u{1F3BD}", "\u{1F3BF}", "\u{1F6F7}", "\u{1F94C}",],],
  ["game", ["\u{1F3AF}", "\u{1FA80}", "\u{1FA81}", "\u{1F3B1}", "\u{1F52E}", "\u{1F9FF}", "\u{1F3AE}", "\u{1F579}", "\u{1F3B0}", "\u{1F3B2}", "\u{1F9E9}", "\u{1F9F8}", "\u{2660}", "\u{2665}", "\u{2666}", "\u{2663}", "\u{265F}", "\u{1F0CF}", "\u{1F004}", "\u{1F3B4}",],],
  ["arts & crafts", ["\u{1F3AD}", "\u{1F5BC}", "\u{1F3A8}", "\u{1F9F5}", "\u{1F9F6}", "\u{1FAA2}",],],
  ["clothing", ["\u{1F453}", "\u{1F576}", "\u{1F97D}", "\u{1F97C}", "\u{1F9BA}", "\u{1F454}", "\u{1F455}", "\u{1F456}", "\u{1F9E3}", "\u{1F9E4}", "\u{1F9E5}", "\u{1F9E6}", "\u{1F457}", "\u{1F458}", "\u{1F97B}", "\u{1FA71}", "\u{1FA72}", "\u{1FA73}", "\u{1F459}", "\u{1F45A}", "\u{1F45B}", "\u{1F45C}", "\u{1F45D}", "\u{1F6CD}", "\u{1F392}", "\u{1F45E}", "\u{1F45F}", "\u{1F97E}", "\u{1F97F}", "\u{1F460}", "\u{1F461}", "\u{1FA70}", "\u{1F462}", "\u{1F451}", "\u{1F452}", "\u{1F3A9}", "\u{1F393}", "\u{1F9E2}", "\u{26D1}", "\u{1F4FF}", "\u{1F484}", "\u{1F48D}", "\u{1F48E}",],],
  ["sound", ["\u{1F507}", "\u{1F508}", "\u{1F509}", "\u{1F50A}", "\u{1F4E2}", "\u{1F4E3}", "\u{1F4EF}", "\u{1F514}", "\u{1F515}",],],
  ["music", ["\u{1F3BC}", "\u{1F3B5}", "\u{1F3B6}", "\u{1F399}", "\u{1F39A}", "\u{1F39B}", "\u{1F3A4}", "\u{1F3A7}", "\u{1F4FB}",],],
  ["musical-instrument", ["\u{1F3B7}", "\u{1F3B8}", "\u{1F3B9}", "\u{1F3BA}", "\u{1F3BB}", "\u{1FA95}", "\u{1F941}",],],
  ["phone", ["\u{1F4F1}", "\u{1F4F2}", "\u{260E}", "\u{1F4DE}", "\u{1F4DF}", "\u{1F4E0}",],],
  ["computer", ["\u{1F50B}", "\u{1F50C}", "\u{1F4BB}", "\u{1F5A5}", "\u{1F5A8}", "\u{2328}", "\u{1F5B1}", "\u{1F5B2}", "\u{1F4BD}", "\u{1F4BE}", "\u{1F4BF}", "\u{1F4C0}", "\u{1F9EE}",],],
  ["light & video", ["\u{1F3A5}", "\u{1F39E}", "\u{1F4FD}", "\u{1F3AC}", "\u{1F4FA}", "\u{1F4F7}", "\u{1F4F8}", "\u{1F4F9}", "\u{1F4FC}", "\u{1F50D}", "\u{1F50E}", "\u{1F56F}", "\u{1F4A1}", "\u{1F526}", "\u{1F3EE}", "\u{1FA94}",],],
  ["book-paper", ["\u{1F4D4}", "\u{1F4D5}", "\u{1F4D6}", "\u{1F4D7}", "\u{1F4D8}", "\u{1F4D9}", "\u{1F4DA}", "\u{1F4D3}", "\u{1F4D2}", "\u{1F4C3}", "\u{1F4DC}", "\u{1F4C4}", "\u{1F4F0}", "\u{1F5DE}", "\u{1F4D1}", "\u{1F516}", "\u{1F3F7}",],],
  ["money", ["\u{1F4B0}", "\u{1F4B4}", "\u{1F4B5}", "\u{1F4B6}", "\u{1F4B7}", "\u{1F4B8}", "\u{1F4B3}", "\u{1F9FE}", "\u{1F4B9}",],],
  ["mail", ["\u{2709}", "\u{1F4E7}", "\u{1F4E8}", "\u{1F4E9}", "\u{1F4E4}", "\u{1F4E5}", "\u{1F4E6}", "\u{1F4EB}", "\u{1F4EA}", "\u{1F4EC}", "\u{1F4ED}", "\u{1F4EE}", "\u{1F5F3}",],],
  ["writing", ["\u{270F}", "\u{2712}", "\u{1F58B}", "\u{1F58A}", "\u{1F58C}", "\u{1F58D}", "\u{1F4DD}",],],
  ["office", ["\u{1F4BC}", "\u{1F4C1}", "\u{1F4C2}", "\u{1F5C2}", "\u{1F4C5}", "\u{1F4C6}", "\u{1F5D2}", "\u{1F5D3}", "\u{1F4C7}", "\u{1F4C8}", "\u{1F4C9}", "\u{1F4CA}", "\u{1F4CB}", "\u{1F4CC}", "\u{1F4CD}", "\u{1F4CE}", "\u{1F587}", "\u{1F4CF}", "\u{1F4D0}", "\u{2702}", "\u{1F5C3}", "\u{1F5C4}", "\u{1F5D1}",],],
  ["lock", ["\u{1F512}", "\u{1F513}", "\u{1F50F}", "\u{1F510}", "\u{1F511}", "\u{1F5DD}",],],
  ["tool", ["\u{1F528}", "\u{1FA93}", "\u{26CF}", "\u{2692}", "\u{1F6E0}", "\u{1F5E1}", "\u{2694}", "\u{1F52B}", "\u{1F3F9}", "\u{1F6E1}", "\u{1F527}", "\u{1F529}", "\u{2699}", "\u{1F5DC}", "\u{2696}", "\u{1F9AF}", "\u{1F517}", "\u{26D3}", "\u{1F9F0}", "\u{1F9F2}",],],
  ["science", ["\u{2697}", "\u{1F9EA}", "\u{1F9EB}", "\u{1F9EC}", "\u{1F52C}", "\u{1F52D}", "\u{1F4E1}",],],
  ["medical", ["\u{1F489}", "\u{1FA78}", "\u{1F48A}", "\u{1FA79}", "\u{1FA7A}"],],
  ["household", ["\u{1F6AA}", "\u{1F6D7}", "\u{1FA9F}", "\u{1F6CF}", "\u{1F6CB}", "\u{1FA91}", "\u{1F6BD}", "\u{1F6BF}", "\u{1F6C1}", "\u{1FA92}", "\u{1F9F4}", "\u{1F9F7}", "\u{1F9F9}", "\u{1F9FA}", "\u{1F9FB}", "\u{1F9FC}", "\u{1F9FD}", "\u{1F9EF}", "\u{1F6D2}",],],
  ["other-object", ["\u{1F6AC}", "\u{26B0}", "\u{26B1}", "\u{1F5FF}"]],
  ["transport-sign", ["\u{1F3E7}", "\u{1F6AE}", "\u{1F6B0}", "\u{267F}", "\u{1F6B9}", "\u{1F6BA}", "\u{1F6BB}", "\u{1F6BC}", "\u{1F6BE}", "\u{1F6C2}", "\u{1F6C3}", "\u{1F6C4}", "\u{1F6C5}",],],
  ["warning", ["\u{26A0}", "\u{1F6B8}", "\u{26D4}", "\u{1F6AB}", "\u{1F6B3}", "\u{1F6AD}", "\u{1F6AF}", "\u{1F6B1}", "\u{1F6B7}", "\u{1F4F5}", "\u{1F51E}", "\u{2622}", "\u{2623}",],],
  ["arrow", ["\u{2B06}", "\u{2197}", "\u{27A1}", "\u{2198}", "\u{2B07}", "\u{2199}", "\u{2B05}", "\u{2196}", "\u{2195}", "\u{2194}", "\u{21A9}", "\u{21AA}", "\u{2934}", "\u{2935}", "\u{1F503}", "\u{1F504}", "\u{1F519}", "\u{1F51A}", "\u{1F51B}", "\u{1F51C}", "\u{1F51D}",],],
  ["religion", ["\u{1F6D0}", "\u{269B}", "\u{1F549}", "\u{2721}", "\u{2638}", "\u{262F}", "\u{271D}", "\u{2626}", "\u{262A}", "\u{262E}", "\u{1F54E}", "\u{1F52F}",],],
  ["zodiac", ["\u{2648}", "\u{2649}", "\u{264A}", "\u{264B}", "\u{264C}", "\u{264D}", "\u{264E}", "\u{264F}", "\u{2650}", "\u{2651}", "\u{2652}", "\u{2653}", "\u{26CE}",],],
  ["av-symbol", ["\u{1F500}", "\u{1F501}", "\u{1F502}", "\u{25B6}", "\u{23E9}", "\u{23ED}", "\u{23EF}", "\u{25C0}", "\u{23EA}", "\u{23EE}", "\u{1F53C}", "\u{23EB}", "\u{1F53D}", "\u{23EC}", "\u{23F8}", "\u{23F9}", "\u{23FA}", "\u{23CF}", "\u{1F3A6}", "\u{1F505}", "\u{1F506}", "\u{1F4F6}", "\u{1F4F3}", "\u{1F4F4}",],],
  ["gender", ["\u{2640}", "\u{2642}", "\u{26A7}"]],
  ["math", ["\u{2716}", "\u{2795}", "\u{2796}", "\u{2797}", "\u{267E}"]],
  ["punctuation", ["\u{203C}", "\u{2049}", "\u{2753}", "\u{2754}", "\u{2755}", "\u{2757}", "\u{3030}",],],
  ["currency", ["\u{1F4B1}", "\u{1F4B2}"]],
  ["other-symbol", ["\u{2695}", "\u{267B}", "\u{269C}", "\u{1F531}", "\u{1F4DB}", "\u{1F530}", "\u{2B55}", "\u{2705}", "\u{2611}", "\u{2714}", "\u{274C}", "\u{274E}", "\u{27B0}", "\u{27BF}", "\u{303D}", "\u{2733}", "\u{2734}", "\u{2747}", "\u{00A9}", "\u{00AE}", "\u{2122}",],],
  ["keycap", ["\u{0023}\u{FE0F}\u{20E3}", "\u{002A}\u{FE0F}\u{20E3}", "\u{0030}\u{FE0F}\u{20E3}", "\u{0031}\u{FE0F}\u{20E3}", "\u{0032}\u{FE0F}\u{20E3}", "\u{0033}\u{FE0F}\u{20E3}", "\u{0034}\u{FE0F}\u{20E3}", "\u{0035}\u{FE0F}\u{20E3}", "\u{0036}\u{FE0F}\u{20E3}", "\u{0037}\u{FE0F}\u{20E3}", "\u{0038}\u{FE0F}\u{20E3}", "\u{0039}\u{FE0F}\u{20E3}", "\u{1F51F}",],],
  ["alphanum", ["\u{1F520}", "\u{1F521}", "\u{1F522}", "\u{1F523}", "\u{1F524}", "\u{1F170}", "\u{1F18E}", "\u{1F171}", "\u{1F191}", "\u{1F192}", "\u{1F193}", "\u{2139}", "\u{1F194}", "\u{24C2}", "\u{1F195}", "\u{1F196}", "\u{1F17E}", "\u{1F197}", "\u{1F17F}", "\u{1F198}", "\u{1F199}", "\u{1F19A}", "\u{1F201}", "\u{1F202}", "\u{1F237}", "\u{1F236}", "\u{1F22F}", "\u{1F250}", "\u{1F239}", "\u{1F21A}", "\u{1F232}", "\u{1F251}", "\u{1F238}", "\u{1F234}", "\u{1F233}", "\u{3297}", "\u{3299}", "\u{1F23A}", "\u{1F235}",],],
  ["geometric", ["\u{1F534}", "\u{1F7E0}", "\u{1F7E1}", "\u{1F7E2}", "\u{1F535}", "\u{1F7E3}", "\u{1F7E4}", "\u{26AB}", "\u{26AA}", "\u{1F7E5}", "\u{1F7E7}", "\u{1F7E8}", "\u{1F7E9}", "\u{1F7E6}", "\u{1F7EA}", "\u{1F7EB}", "\u{2B1B}", "\u{2B1C}", "\u{25FC}", "\u{25FB}", "\u{25FE}", "\u{25FD}", "\u{25AA}", "\u{25AB}", "\u{1F536}", "\u{1F537}", "\u{1F538}", "\u{1F539}", "\u{1F53A}", "\u{1F53B}", "\u{1F4A0}", "\u{1F518}", "\u{1F533}", "\u{1F532}",],],
  ["flag", ["\u{1F3C1}", "\u{1F6A9}", "\u{1F38C}", "\u{1F3F4}", "\u{1F3F3}", "\u{1F3F3}\u{FE0F}\u{200D}\u{1F308}", "\u{1F3F4}\u{200D}\u{2620}\u{FE0F}",],],
  ["country-flag", ["\u{1F1E6} \u{1F1E8}", "\u{1F1E6} \u{1F1E9}", "\u{1F1E6} \u{1F1EA}", "\u{1F1E6} \u{1F1EB}", "\u{1F1E6} \u{1F1EC}", "\u{1F1E6} \u{1F1EE}", "\u{1F1E6} \u{1F1F1}", "\u{1F1E6} \u{1F1F2}", "\u{1F1E6} \u{1F1F4}", "\u{1F1E6} \u{1F1F6}", "\u{1F1E6} \u{1F1F7}", "\u{1F1E6} \u{1F1F8}", "\u{1F1E6} \u{1F1F9}", "\u{1F1E6} \u{1F1FA}", "\u{1F1E6} \u{1F1FC}", "\u{1F1E6} \u{1F1FD}", "\u{1F1E6} \u{1F1FF}", "\u{1F1E7} \u{1F1E6}", "\u{1F1E7} \u{1F1E7}", "\u{1F1E7} \u{1F1E9}", "\u{1F1E7} \u{1F1EA}", "\u{1F1E7} \u{1F1EB}", "\u{1F1E7} \u{1F1EC}", "\u{1F1E7} \u{1F1ED}", "\u{1F1E7} \u{1F1EE}", "\u{1F1E7} \u{1F1EF}", "\u{1F1E7} \u{1F1F1}", "\u{1F1E7} \u{1F1F2}", "\u{1F1E7} \u{1F1F3}", "\u{1F1E7} \u{1F1F4}", "\u{1F1E7} \u{1F1F6}", "\u{1F1E7} \u{1F1F7}", "\u{1F1E7} \u{1F1F8}", "\u{1F1E7} \u{1F1F9}", "\u{1F1E7} \u{1F1FB}", "\u{1F1E7} \u{1F1FC}", "\u{1F1E7} \u{1F1FE}", "\u{1F1E7} \u{1F1FF}", "\u{1F1E8} \u{1F1E6}", "\u{1F1E8} \u{1F1E8}", "\u{1F1E8} \u{1F1E9}", "\u{1F1E8} \u{1F1EB}", "\u{1F1E8} \u{1F1EC}", "\u{1F1E8} \u{1F1ED}", "\u{1F1E8} \u{1F1EE}", "\u{1F1E8} \u{1F1F0}", "\u{1F1E8} \u{1F1F1}", "\u{1F1E8} \u{1F1F2}", "\u{1F1E8} \u{1F1F3}", "\u{1F1E8} \u{1F1F4}", "\u{1F1E8} \u{1F1F5}", "\u{1F1E8} \u{1F1F7}", "\u{1F1E8} \u{1F1FA}", "\u{1F1E8} \u{1F1FB}", "\u{1F1E8} \u{1F1FC}", "\u{1F1E8} \u{1F1FD}", "\u{1F1E8} \u{1F1FE}", "\u{1F1E8} \u{1F1FF}", "\u{1F1E9} \u{1F1EA}", "\u{1F1E9} \u{1F1EC}", "\u{1F1E9} \u{1F1EF}", "\u{1F1E9} \u{1F1F0}", "\u{1F1E9} \u{1F1F2}", "\u{1F1E9} \u{1F1F4}", "\u{1F1E9} \u{1F1FF}", "\u{1F1EA} \u{1F1E6}", "\u{1F1EA} \u{1F1E8}", "\u{1F1EA} \u{1F1EA}", "\u{1F1EA} \u{1F1EC}", "\u{1F1EA} \u{1F1ED}", "\u{1F1EA} \u{1F1F7}", "\u{1F1EA} \u{1F1F8}", "\u{1F1EA} \u{1F1F9}", "\u{1F1EA} \u{1F1FA}", "\u{1F1EB} \u{1F1EE}", "\u{1F1EB} \u{1F1EF}", "\u{1F1EB} \u{1F1F0}", "\u{1F1EB} \u{1F1F2}", "\u{1F1EB} \u{1F1F4}", "\u{1F1EB} \u{1F1F7}", "\u{1F1EC} \u{1F1E6}", "\u{1F1EC} \u{1F1E7}", "\u{1F1EC} \u{1F1E9}", "\u{1F1EC} \u{1F1EA}", "\u{1F1EC} \u{1F1EB}", "\u{1F1EC} \u{1F1EC}", "\u{1F1EC} \u{1F1ED}", "\u{1F1EC} \u{1F1EE}", "\u{1F1EC} \u{1F1F1}", "\u{1F1EC} \u{1F1F2}", "\u{1F1EC} \u{1F1F3}", "\u{1F1EC} \u{1F1F5}", "\u{1F1EC} \u{1F1F6}", "\u{1F1EC} \u{1F1F7}", "\u{1F1EC} \u{1F1F8}", "\u{1F1EC} \u{1F1F9}", "\u{1F1EC} \u{1F1FA}", "\u{1F1EC} \u{1F1FC}", "\u{1F1EC} \u{1F1FE}", "\u{1F1ED} \u{1F1F0}", "\u{1F1ED} \u{1F1F2}", "\u{1F1ED} \u{1F1F3}", "\u{1F1ED} \u{1F1F7}", "\u{1F1ED} \u{1F1F9}", "\u{1F1ED} \u{1F1FA}", "\u{1F1EE} \u{1F1E8}", "\u{1F1EE} \u{1F1E9}", "\u{1F1EE} \u{1F1EA}", "\u{1F1EE} \u{1F1F1}", "\u{1F1EE} \u{1F1F2}", "\u{1F1EE} \u{1F1F3}", "\u{1F1EE} \u{1F1F4}", "\u{1F1EE} \u{1F1F6}", "\u{1F1EE} \u{1F1F7}", "\u{1F1EE} \u{1F1F8}", "\u{1F1EE} \u{1F1F9}", "\u{1F1EF} \u{1F1EA}", "\u{1F1EF} \u{1F1F2}", "\u{1F1EF} \u{1F1F4}", "\u{1F1EF} \u{1F1F5}", "\u{1F1F0} \u{1F1EA}", "\u{1F1F0} \u{1F1EC}", "\u{1F1F0} \u{1F1ED}", "\u{1F1F0} \u{1F1EE}", "\u{1F1F0} \u{1F1F2}", "\u{1F1F0} \u{1F1F3}", "\u{1F1F0} \u{1F1F5}", "\u{1F1F0} \u{1F1F7}", "\u{1F1F0} \u{1F1FC}", "\u{1F1F0} \u{1F1FE}", "\u{1F1F0} \u{1F1FF}", "\u{1F1F1} \u{1F1E6}", "\u{1F1F1} \u{1F1E7}", "\u{1F1F1} \u{1F1E8}", "\u{1F1F1} \u{1F1EE}", "\u{1F1F1} \u{1F1F0}", "\u{1F1F1} \u{1F1F7}", "\u{1F1F1} \u{1F1F8}", "\u{1F1F1} \u{1F1F9}", "\u{1F1F1} \u{1F1FA}", "\u{1F1F1} \u{1F1FB}", "\u{1F1F1} \u{1F1FE}", "\u{1F1F2} \u{1F1E6}", "\u{1F1F2} \u{1F1E8}", "\u{1F1F2} \u{1F1E9}", "\u{1F1F2} \u{1F1EA}", "\u{1F1F2} \u{1F1EB}", "\u{1F1F2} \u{1F1EC}", "\u{1F1F2} \u{1F1ED}", "\u{1F1F2} \u{1F1F0}", "\u{1F1F2} \u{1F1F1}", "\u{1F1F2} \u{1F1F2}", "\u{1F1F2} \u{1F1F3}", "\u{1F1F2} \u{1F1F4}", "\u{1F1F2} \u{1F1F5}", "\u{1F1F2} \u{1F1F6}", "\u{1F1F2} \u{1F1F7}", "\u{1F1F2} \u{1F1F8}", "\u{1F1F2} \u{1F1F9}", "\u{1F1F2} \u{1F1FA}", "\u{1F1F2} \u{1F1FB}", "\u{1F1F2} \u{1F1FC}", "\u{1F1F2} \u{1F1FD}", "\u{1F1F2} \u{1F1FE}", "\u{1F1F2} \u{1F1FF}", "\u{1F1F3} \u{1F1E6}", "\u{1F1F3} \u{1F1E8}", "\u{1F1F3} \u{1F1EA}", "\u{1F1F3} \u{1F1EB}", "\u{1F1F3} \u{1F1EC}", "\u{1F1F3} \u{1F1EE}", "\u{1F1F3} \u{1F1F1}", "\u{1F1F3} \u{1F1F4}", "\u{1F1F3} \u{1F1F5}", "\u{1F1F3} \u{1F1F7}", "\u{1F1F3} \u{1F1FA}", "\u{1F1F3} \u{1F1FF}", "\u{1F1F4} \u{1F1F2}", "\u{1F1F5} \u{1F1E6}", "\u{1F1F5} \u{1F1EA}", "\u{1F1F5} \u{1F1EB}", "\u{1F1F5} \u{1F1EC}", "\u{1F1F5} \u{1F1ED}", "\u{1F1F5} \u{1F1F0}", "\u{1F1F5} \u{1F1F1}", "\u{1F1F5} \u{1F1F2}", "\u{1F1F5} \u{1F1F3}", "\u{1F1F5} \u{1F1F7}", "\u{1F1F5} \u{1F1F8}", "\u{1F1F5} \u{1F1F9}", "\u{1F1F5} \u{1F1FC}", "\u{1F1F5} \u{1F1FE}", "\u{1F1F6} \u{1F1E6}", "\u{1F1F7} \u{1F1EA}", "\u{1F1F7} \u{1F1F4}", "\u{1F1F7} \u{1F1F8}", "\u{1F1F7} \u{1F1FA}", "\u{1F1F7} \u{1F1FC}", "\u{1F1F8} \u{1F1E6}", "\u{1F1F8} \u{1F1E7}", "\u{1F1F8} \u{1F1E8}", "\u{1F1F8} \u{1F1E9}", "\u{1F1F8} \u{1F1EA}", "\u{1F1F8} \u{1F1EC}", "\u{1F1F8} \u{1F1ED}", "\u{1F1F8} \u{1F1EE}", "\u{1F1F8} \u{1F1EF}", "\u{1F1F8} \u{1F1F0}", "\u{1F1F8} \u{1F1F1}", "\u{1F1F8} \u{1F1F2}", "\u{1F1F8} \u{1F1F3}", "\u{1F1F8} \u{1F1F4}", "\u{1F1F8} \u{1F1F7}", "\u{1F1F8} \u{1F1F8}", "\u{1F1F8} \u{1F1F9}", "\u{1F1F8} \u{1F1FB}", "\u{1F1F8} \u{1F1FD}", "\u{1F1F8} \u{1F1FE}", "\u{1F1F8} \u{1F1FF}", "\u{1F1F9} \u{1F1E6}", "\u{1F1F9} \u{1F1E8}", "\u{1F1F9} \u{1F1E9}", "\u{1F1F9} \u{1F1EB}", "\u{1F1F9} \u{1F1EC}", "\u{1F1F9} \u{1F1ED}", "\u{1F1F9} \u{1F1EF}", "\u{1F1F9} \u{1F1F0}", "\u{1F1F9} \u{1F1F1}", "\u{1F1F9} \u{1F1F2}", "\u{1F1F9} \u{1F1F3}", "\u{1F1F9} \u{1F1F4}", "\u{1F1F9} \u{1F1F7}", "\u{1F1F9} \u{1F1F9}", "\u{1F1F9} \u{1F1FB}", "\u{1F1F9} \u{1F1FC}", "\u{1F1F9} \u{1F1FF}", "\u{1F1FA} \u{1F1E6}", "\u{1F1FA} \u{1F1EC}", "\u{1F1FA} \u{1F1F2}", "\u{1F1FA} \u{1F1F3}", "\u{1F1FA} \u{1F1F8}", "\u{1F1FA} \u{1F1FE}", "\u{1F1FA} \u{1F1FF}", "\u{1F1FB} \u{1F1E6}", "\u{1F1FB} \u{1F1E8}", "\u{1F1FB} \u{1F1EA}", "\u{1F1FB} \u{1F1EC}", "\u{1F1FB} \u{1F1EE}", "\u{1F1FB} \u{1F1F3}", "\u{1F1FB} \u{1F1FA}", "\u{1F1FC} \u{1F1EB}", "\u{1F1FC} \u{1F1F8}", "\u{1F1FD} \u{1F1F0}", "\u{1F1FE} \u{1F1EA}", "\u{1F1FE} \u{1F1F9}", "\u{1F1FF} \u{1F1E6}", "\u{1F1FF} \u{1F1F2}", "\u{1F1FF} \u{1F1FC}",],],
  ["subdivision-flag", ["\u{1F3F4} \u{E0067} \u{E0062} \u{E0065} \u{E006E} \u{E0067} \u{E007F}", "\u{1F3F4} \u{E0067} \u{E0062} \u{E0073} \u{E0063} \u{E0074} \u{E007F}", "\u{1F3F4} \u{E0067} \u{E0062} \u{E0077} \u{E006C} \u{E0073} \u{E007F}",],],
];

这是 Unicode v12 里的 emoji,数量更少,但兼容性更好,会导致 EmojiSelect 中出现空 Tab,建议你把空 Tab 删掉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type EmojiList = [string, string[]][];
export const emojiList: EmojiList = [
  ["face-smiling", ["\u{1F600}", "\u{1F603}", "\u{1F604}", "\u{1F601}", "\u{1F606}", "\u{1F605}", "\u{1F923}", "\u{1F602}", "\u{1F642}", "\u{1F643}", "\u{1F609}", "\u{1F60A}", "\u{1F607}",],],
  ["face-affection", ["\u{1F970}", "\u{1F60D}", "\u{1F929}", "\u{1F618}", "\u{1F617}", "\u{263A}", "\u{1F61A}", "\u{1F619}",],],
  ["face-tongue", ["\u{1F60B}", "\u{1F61B}", "\u{1F61C}", "\u{1F92A}", "\u{1F61D}", "\u{1F911}",],],
  ["face-hand", ["\u{1F917}", "\u{1F92D}", "\u{1F92B}", "\u{1F914}"]],
  ["face-neutral-skeptical", ["\u{1F910}", "\u{1F928}", "\u{1F610}", "\u{1F611}", "\u{1F636}", "\u{1F60F}", "\u{1F612}", "\u{1F644}", "\u{1F62C}", "\u{1F925}",],],
  ["face-sleepy", ["\u{1F60C}", "\u{1F614}", "\u{1F62A}", "\u{1F924}", "\u{1F634}"],],
  ["face-unwell", ["\u{1F637}", "\u{1F912}", "\u{1F915}", "\u{1F922}", "\u{1F92E}", "\u{1F927}", "\u{1F975}", "\u{1F976}", "\u{1F974}", "\u{1F635}", "\u{1F92F}",],],
  ["face-hat", ["\u{1F920}", "\u{1F973}"]],
  ["face-glasses", ["\u{1F60E}", "\u{1F913}", "\u{1F9D0}"]],
  [ "face-concerned", [ "\u{1F615}", "\u{1F61F}", "\u{1F641}", "\u{2639}", "\u{1F62E}", "\u{1F62F}", "\u{1F632}", "\u{1F633}", "\u{1F97A}", "\u{1F626}", "\u{1F627}", "\u{1F628}", "\u{1F630}", "\u{1F625}", "\u{1F622}", "\u{1F62D}", "\u{1F631}", "\u{1F616}", "\u{1F623}", "\u{1F61E}", "\u{1F613}", "\u{1F629}", "\u{1F62B}", "\u{1F971}", ], ],
  [ "face-negative", [ "\u{1F624}", "\u{1F621}", "\u{1F620}", "\u{1F92C}", "\u{1F608}", "\u{1F47F}", "\u{1F480}", "\u{2620}", ], ],
  [ "face-costume", [ "\u{1F4A9}", "\u{1F921}", "\u{1F479}", "\u{1F47A}", "\u{1F47B}", "\u{1F47D}", "\u{1F47E}", "\u{1F916}", ], ],
  [ "cat-face", [ "\u{1F63A}", "\u{1F638}", "\u{1F639}", "\u{1F63B}", "\u{1F63C}", "\u{1F63D}", "\u{1F640}", "\u{1F63F}", "\u{1F63E}", ], ],
  ["monkey-face", ["\u{1F648}", "\u{1F649}", "\u{1F64A}"]],
  [ "emotion", [ "\u{1F48B}", "\u{1F48C}", "\u{1F498}", "\u{1F49D}", "\u{1F496}", "\u{1F497}", "\u{1F493}", "\u{1F49E}", "\u{1F495}", "\u{1F49F}", "\u{2763}", "\u{1F494}", "\u{2764}", "\u{1F9E1}", "\u{1F49B}", "\u{1F49A}", "\u{1F499}", "\u{1F49C}", "\u{1F90E}", "\u{1F5A4}", "\u{1F90D}", "\u{1F4AF}", "\u{1F4A2}", "\u{1F4A5}", "\u{1F4AB}", "\u{1F4A6}", "\u{1F4A8}", "\u{1F573}", "\u{1F4A3}", "\u{1F4AC}", "\u{1F441}\u{FE0F}\u{200D}\u{1F5E8}\u{FE0F}", "\u{1F5E8}", "\u{1F5EF}", "\u{1F4AD}", "\u{1F4A4}", ], ],
  [ "hand-fingers-open", ["\u{1F44B}", "\u{1F91A}", "\u{1F590}", "\u{270B}", "\u{1F596}"], ],
  [ "hand-fingers-partial", [ "\u{1F44C}", "\u{1F90F}", "\u{270C}", "\u{1F91E}", "\u{1F91F}", "\u{1F918}", "\u{1F919}", ], ],
  [ "hand-single-finger", [ "\u{1F448}", "\u{1F449}", "\u{1F446}", "\u{1F595}", "\u{1F447}", "\u{261D}", ], ],
  [ "hand-fingers-closed", [ "\u{1F44D}", "\u{1F44E}", "\u{270A}", "\u{1F44A}", "\u{1F91B}", "\u{1F91C}", ], ],
  [ "hands", [ "\u{1F44F}", "\u{1F64C}", "\u{1F450}", "\u{1F932}", "\u{1F91D}", "\u{1F64F}", ], ],
  ["hand-prop", ["\u{270D}", "\u{1F485}", "\u{1F933}"]],
  [ "body-parts", [ "\u{1F4AA}", "\u{1F9BE}", "\u{1F9BF}", "\u{1F9B5}", "\u{1F9B6}", "\u{1F442}", "\u{1F9BB}", "\u{1F443}", "\u{1F9E0}", "\u{1F9B7}", "\u{1F9B4}", "\u{1F440}", "\u{1F441}", "\u{1F445}", "\u{1F444}", ], ],
  [ "person", [ "\u{1F476}", "\u{1F9D2}", "\u{1F466}", "\u{1F467}", "\u{1F9D1}", "\u{1F471}", "\u{1F468}", "\u{1F9D4}", "\u{1F471}\u{200D}\u{2642}\u{FE0F}", "\u{1F468}\u{200D}\u{1F9B0}", "\u{1F468}\u{200D}\u{1F9B1}", "\u{1F468}\u{200D}\u{1F9B3}", "\u{1F468}\u{200D}\u{1F9B2}", "\u{1F469}", "\u{1F471}\u{200D}\u{2640}\u{FE0F}", "\u{1F469}\u{200D}\u{1F9B0}", "\u{1F469}\u{200D}\u{1F9B1}", "\u{1F469}\u{200D}\u{1F9B3}", "\u{1F469}\u{200D}\u{1F9B2}", "\u{1F9D3}", "\u{1F474}", "\u{1F475}", ], ],
  [ "person-gesture", [ "\u{1F64D}", "\u{1F64D}\u{200D}\u{2642}\u{FE0F}", "\u{1F64D}\u{200D}\u{2640}\u{FE0F}", "\u{1F64E}", "\u{1F64E}\u{200D}\u{2642}\u{FE0F}", "\u{1F64E}\u{200D}\u{2640}\u{FE0F}", "\u{1F645}", "\u{1F645}\u{200D}\u{2642}\u{FE0F}", "\u{1F645}\u{200D}\u{2640}\u{FE0F}", "\u{1F646}", "\u{1F646}\u{200D}\u{2642}\u{FE0F}", "\u{1F646}\u{200D}\u{2640}\u{FE0F}", "\u{1F481}", "\u{1F481}\u{200D}\u{2642}\u{FE0F}", "\u{1F481}\u{200D}\u{2640}\u{FE0F}", "\u{1F64B}", "\u{1F64B}\u{200D}\u{2642}\u{FE0F}", "\u{1F64B}\u{200D}\u{2640}\u{FE0F}", "\u{1F9CF}", "\u{1F9CF}\u{200D}\u{2642}\u{FE0F}", "\u{1F9CF}\u{200D}\u{2640}\u{FE0F}", "\u{1F647}", "\u{1F647}\u{200D}\u{2642}\u{FE0F}", "\u{1F647}\u{200D}\u{2640}\u{FE0F}", "\u{1F926}", "\u{1F926}\u{200D}\u{2642}\u{FE0F}", "\u{1F926}\u{200D}\u{2640}\u{FE0F}", "\u{1F937}", "\u{1F937}\u{200D}\u{2642}\u{FE0F}", "\u{1F937}\u{200D}\u{2640}\u{FE0F}", ], ],
  [ "person-role", [ "\u{1F468}\u{200D}\u{2695}\u{FE0F}", "\u{1F469}\u{200D}\u{2695}\u{FE0F}", "\u{1F468}\u{200D}\u{1F393}", "\u{1F469}\u{200D}\u{1F393}", "\u{1F468}\u{200D}\u{1F3EB}", "\u{1F469}\u{200D}\u{1F3EB}", "\u{1F468}\u{200D}\u{2696}\u{FE0F}", "\u{1F469}\u{200D}\u{2696}\u{FE0F}", "\u{1F468}\u{200D}\u{1F33E}", "\u{1F469}\u{200D}\u{1F33E}", "\u{1F468}\u{200D}\u{1F373}", "\u{1F469}\u{200D}\u{1F373}", "\u{1F468}\u{200D}\u{1F527}", "\u{1F469}\u{200D}\u{1F527}", "\u{1F468}\u{200D}\u{1F3ED}", "\u{1F469}\u{200D}\u{1F3ED}", "\u{1F468}\u{200D}\u{1F4BC}", "\u{1F469}\u{200D}\u{1F4BC}", "\u{1F468}\u{200D}\u{1F52C}", "\u{1F469}\u{200D}\u{1F52C}", "\u{1F468}\u{200D}\u{1F4BB}", "\u{1F469}\u{200D}\u{1F4BB}", "\u{1F468}\u{200D}\u{1F3A4}", "\u{1F469}\u{200D}\u{1F3A4}", "\u{1F468}\u{200D}\u{1F3A8}", "\u{1F469}\u{200D}\u{1F3A8}", "\u{1F468}\u{200D}\u{2708}\u{FE0F}", "\u{1F469}\u{200D}\u{2708}\u{FE0F}", "\u{1F468}\u{200D}\u{1F680}", "\u{1F469}\u{200D}\u{1F680}", "\u{1F468}\u{200D}\u{1F692}", "\u{1F469}\u{200D}\u{1F692}", "\u{1F46E}", "\u{1F46E}\u{200D}\u{2642}\u{FE0F}", "\u{1F46E}\u{200D}\u{2640}\u{FE0F}", "\u{1F575}", "\u{1F575}\u{FE0F}\u{200D}\u{2642}\u{FE0F}", "\u{1F575}\u{FE0F}\u{200D}\u{2640}\u{FE0F}", "\u{1F482}", "\u{1F482}\u{200D}\u{2642}\u{FE0F}", "\u{1F482}\u{200D}\u{2640}\u{FE0F}", "\u{1F477}", "\u{1F477}\u{200D}\u{2642}\u{FE0F}", "\u{1F477}\u{200D}\u{2640}\u{FE0F}", "\u{1F934}", "\u{1F478}", "\u{1F473}", "\u{1F473}\u{200D}\u{2642}\u{FE0F}", "\u{1F473}\u{200D}\u{2640}\u{FE0F}", "\u{1F472}", "\u{1F9D5}", "\u{1F935}", "\u{1F470}", "\u{1F930}", "\u{1F931}", ], ],
  [ "person-fantasy", [ "\u{1F47C}", "\u{1F385}", "\u{1F936}", "\u{1F9B8}", "\u{1F9B8}\u{200D}\u{2642}\u{FE0F}", "\u{1F9B8}\u{200D}\u{2640}\u{FE0F}", "\u{1F9B9}", "\u{1F9B9}\u{200D}\u{2642}\u{FE0F}", "\u{1F9B9}\u{200D}\u{2640}\u{FE0F}", "\u{1F9D9}", "\u{1F9D9}\u{200D}\u{2642}\u{FE0F}", "\u{1F9D9}\u{200D}\u{2640}\u{FE0F}", "\u{1F9DA}", "\u{1F9DA}\u{200D}\u{2642}\u{FE0F}", "\u{1F9DA}\u{200D}\u{2640}\u{FE0F}", ], ],
];

·未完待续·

参考文章

相关文章


  • 作者: Joel
  • 文章链接:
  • 版权声明
  • 非自由转载-非商用-非衍生-保持署名