0%

Emoji 识别与过滤

后台提了一个需求,要求用户输入上传的内容中不能带 Emoji。网上有一些资料,都提到了过滤 Emoji 的方法,但都存在多过滤或少过滤的情况。我从官方的标准资料入手,希望能解决掉这个问题。

那我们先看看 Emoji 有什么特征。

Emoji 是什么

Emoji 就是可以在文字中输入的表情符。想必大家都用过:

😄😊😃😍😉

看到这些图标,不用多说了吧。当前正式标准为 11.0 版本,Emoji 是 Unicode 的一部分,它在 Unicode 中有对应的码点( CodePoint),也就是说,Emoji 符号就是一个文字。

根据 Emoji 维基百科说明,当前版本中共有 1212 个 Emoji ,实际上这指的是单码点的 Emoji,而还有一些 Emoji 是通过多个码点组合而成。

例如”零宽度连接符”(ZERO WIDTH JOINER,缩写 ZWJ)U+200D。将U+1F468:男人 U+1F469:女人 U+1F467:女孩这三个码点使用U+200D连接起来,U+1F468 U+200D U+1F469 U+200D U+1F467,就会显示为一个 Emoji 👨‍👩‍👧,表示他们组成的家庭。如果用户的系统不支持这种方法,就还是显示为三个独立的 Emoji 👨👩👧。

例如如代表肤色的(U+1F3FB–U+1F3FF): 🏻 🏼 🏽 🏾 🏿 ,发色的(U+1F9B0-U+1F9B3),组合起来后得到同一个表情的不同肤色版本,这一特性在国际大厂的输入法上可以看到,例如 Apple、Google、Samsung 的输入法上都可以输入。

例如 U+1F1E8 U+1F1F3 组合起来成了中国国旗。

由于多码点组合的存在,可以显示的 Emoji 实际上数量多于 1212 个。

Emoji 的识别

一个字符串是否包含了 Emoji?通过上面的描述,我们可以想到,如果字符串中包含了 Emoji 的码点,那不就说明该字符串包含了 Emoji 吗?因此,我们先获取一份完整的码点集合用来判断。

Emoji 所有的码点

那 Emoji 的码点有哪些呢,Unicode 组织的 Unicode® Emoji Charts v11.0 页面中可以找到完整的 Emoji 码点数据:emoji-data.txt ,这个表的内容的解读可见参考资料。

数据经过以下脚本getEmojiData.sh 处理,可以得到一个完整的、有重复 的码表。

1
2
3
4
5
6
7
8
#! /bin/bash
cat "$1" |
grep -v ^# |
grep -v ^$ |
while read line
do
echo $line | cut -d \; -f 1
done
1
$ ./getEmojiData.sh emoji-data.txt > emoji-all-data.txt

得到的格式如下,数量数百行,列出来的码点不重复的有 3000 多个:

1
2
3
4
5
6
0023
002A
0030..0039
00A9
00AE
...

由于这个码点表有重复元素,我们选择将所有码点添加到 Set 集合中。代码如下(使用列编辑模式可快速编辑完成):

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
public class EmojiUtils {

private static final String TAG = EmojiUtils.class.getSimpleName();
private static Set<Character> emojiSignatureSet = new HashSet<>();

private EmojiUtils() {}

static {
// 省略……
addUnicodeToSet(emojiSignatureSet, 0x2122);
addUnicodeToSet(emojiSignatureSet, 0x2139);
addUnicodeToSet(emojiSignatureSet, 0x2194, 0x2199);
addUnicodeToSet(emojiSignatureSet, 0x21A9, 0x21AA);
// 省略……
}

private static void addUnicodeToSet(Set<Character> set, int code) {
if (set == null) {
return;
}
set.add((char) code);
}

private static void addUnicodeToSet(Set<Character> set, int codeStart, int codeEnd) {
if (set == null) {
return;
}
for (int i = codeStart; i <= codeEnd; i++) {
addUnicodeToSet(set, i);
}
}
}

初试 Emoji 识别

我们有了码表,识别方法就好说了,将字符串拆成单个字符,逐一判断是否是 Emoji 特征码点。

1
2
3
4
5
6
7
8
9
10
11
12
public static boolean isContainEmoji(String s) {
char[] chars = s.toCharArray();
int charsLength = chars.length;

for (int i = 0; i < charsLength; i++) {
char c = chars[i];
if (emojiSignatureSet.contains(c)) {
return true;
}
}
return false;
}

有了识别的方法 EmojiUtils.isContainEmoji(String s) 后,我们来实践一下,过滤掉输入的 Emoji:

1
2
3
4
5
6
7
8
9
etTest.setFilters(new InputFilter[]{new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (EmojiUtils.isContainEmoji(source.toString())) {
return "";
}
return source;
}
}});

运行起来,你会发现并……没……有……用…… ,想怎么输入就怎么输入。

难道这些码点不对吗?当然,这是 Unicode 标准提供的码点表,不可能不对,那一定是判断时出了问题,我们查看一下输入 Emoji 时输入的是什么字符。

Emoji 的表现形式

通过断点,可以看到,输入一个微笑的 Emoji,其内容实际上是 ‘\uD83D’’\uDE03’ ,好像离码点 0x1F603 有点远。实际上,这个输入的编码是特殊的。

Unicode 中计划使用 17 个平面,常用的编码都在第 0 平面中(关于 Unicode 更多知识可以从参考资料进行了解),而在第 0 平面中,有一个特殊的代理区域,不表示任何字符,只用于指向第 1 到第 16 个平面中的字符,这段区域是:D800—DFFF.。其中 0xD800—0xDBFF 是前导代理(lead surrogates),0xDC00—0xDFFF 是后尾代理(trail surrogates)。

它们的代理关系如下图所示:

因此具体的公式是:0x10000 + (前导-0xD800) * 0x400 + (后导-0xDC00) = utf-16编码

我们将微笑 Emoji 的字符串代入计算,结果是:0x10000+(0xD83D - 0xD800)*0x400 + (0xDE03-0xDC00) = 0x1F603 ,与码点正好对应上了!

因此,我们需要修改一下判断方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static boolean isContainEmoji(String s) {
char[] chars = s.toCharArray();
int charsLength = chars.length;

for (int i = 0; i < charsLength; i++) {
char c = chars[i];
char realChar = c;
if (c >= 0xD800 && c <= 0xDBFF && ++i < charsLength) {
char nextChar = chars[i];
realChar = (char) (0x10000 + (c - 0xD800) * 0x400 + (nextChar - 0xDC00));
}
if (emojiSignatureSet.contains(realChar)) {
return true;
}
}
return false;
}

修改过后,使用不同的输入法都尝试一下输入 Emoji,果然,全都被过滤了,无法输入。搞定收工!给自己输入一个666!

嗯?我的 666 呢?这时候,你会发现,无法输入:数字、英文、@、# 等符号。果然没这么简单!

码点表中的奸细

显然,被多过滤掉了字符一定是因为码点集合太多了。仔细查看,终于发现了问题所在。

数字

0023 ; Emoji_Component # 1.1 [1] (#️) number sign
002A ; Emoji_Component # 1.1 [1] (*️) asterisk
0030..0039 ; Emoji_Component # 1.1 [10] (0️..9️) digit zero..digit nine

这些 # * 0~9 这些字符本身是正常的字符,但是它们搭配其他的特征码则变成了 Emoji。

因此,这些字符不能加入特征集合中。数字的问题解决了,还有字母的问题。

字母

根据 Tags (Unicode block) emoji-sequences.txt

E0020 ~ E007F 的使用仅有

1F3F4 E0067 E0062 E0065 E006E E0067 E007F; Emoji_Tag_Sequence; England # 7.0 [1] (🏴󠁧󠁢󠁥󠁮󠁧󠁿)
1F3F4 E0067 E0062 E0073 E0063 E0074 E007F; Emoji_Tag_Sequence; Scotland # 7.0 [1] (🏴󠁧󠁢󠁳󠁣󠁴󠁿)
1F3F4 E0067 E0062 E0077 E006C E0073 E007F; Emoji_Tag_Sequence; Wales # 7.0 [1] (🏴󠁧󠁢󠁷󠁬󠁳󠁿)

而这个范围覆盖了 a~z 及一些符号,如果添加了反而会误判,或者仅添加 E007F 作为 Emoji 特征码

去掉这些奸细,终于可以愉快地输入了……吗?并没有。

还会发现不能输入中文的一些标点符号。再看看还有什么内容没必要添加的。

保留区域

在 emoji-data 中可以看到有一部分码点标记为 reserved,即当前保留着不用,例如<reserved-1F02C>..<reserved-1F02F>,那么把这些保留区域去除是否就可以了呢,经过实验,去除之后确实就没问题了,特别是最后一行,保留区域1FA6E..1FFFD个数达 1424 个,去除这个就可以正常输入中文字符了。

Emoji 的过滤

有了上面提到的特征码点集合,过滤和识别其实是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static String filterEmoji(String s) {
StringBuilder sb = new StringBuilder();
char[] chars = s.toCharArray();
int charsLength = chars.length;

for (int i = 0; i < charsLength; i++) {
char c = chars[i];
char realChar = c;
if (c >= 0xD800 && c <= 0xDBFF && ++i < charsLength) {
char nextChar = chars[i];
realChar = (char) (0x10000 + (c - 0xD800) * 0x400 + (nextChar - 0xDC00));
}
if (!emojiSignatureSet.contains(realChar)) {
sb.append(c);
}
}
return sb.toString();
}

参考链接

通过一番探索,虽然对于字符编码相关的知识还不是特别清晰,但至少比以前了解得更多了。在实现过程中参考了诸多的网上的资料,如果我写得你觉得看得不甚了了,可以看看下面这些资料。

附:完整代码

以下是完整的代码,大家可以自行测试是否有问题,发现问题的话也麻烦反馈给我。

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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
public class EmojiUtils {

private static final String TAG = EmojiUtils.class.getSimpleName();
private static Set<Character> emojiSignatureSet = new HashSet<>(1801);

private EmojiUtils() {}

public static boolean isContainEmoji(String s) {
char[] chars = s.toCharArray();
int charsLength = chars.length;

for (int i = 0; i < charsLength; i++) {
char c = chars[i];
char realChar = c;
if (c >= 0xD800 && c <= 0xDBFF && ++i < charsLength) {
char nextChar = chars[i];
realChar = (char) (0x10000 + (c - 0xD800) * 0x400 + (nextChar - 0xDC00));
}
if (emojiSignatureSet.contains(realChar)) {
return true;
}
}
return false;
}

public static String filterEmoji(String s) {
StringBuilder sb = new StringBuilder();
char[] chars = s.toCharArray();
int charsLength = chars.length;

for (int i = 0; i < charsLength; i++) {
char c = chars[i];
char realChar = c;
if (c >= 0xD800 && c <= 0xDBFF && ++i < charsLength) {
char nextChar = chars[i];
realChar = (char) (0x10000 + (c - 0xD800) * 0x400 + (nextChar - 0xDC00));
}
if (!emojiSignatureSet.contains(realChar)) {
sb.append(c);
}
}
return sb.toString();
}

private static void addUnicodeToSet(Set<Character> set, int code) {
if (set == null) {
return;
}
set.add((char) code);
}

private static void addUnicodeToSet(Set<Character> set, int codeStart, int codeEnd) {
if (set == null) {
return;
}
for (int i = codeStart; i <= codeEnd; i++) {
addUnicodeToSet(set, i);
}
}

static {
Log.d(TAG, "initSignatureSet start");
// -------------------------------------------------------------------
// Part 1: 个数 1212 + 26 = 1238
// -------------------------------------------------------------------
// 根据 https://en.wikipedia.org/wiki/Emoji
// Emoji 11.0 列有 1212 个
// 而从 https://unicode.org/Public/emoji/11.0/emoji-data.txt 可知实际上远不止这个数量
// 即使其列出的 # All omitted code points have Emoji=No 总共也有 1250 个
// 多出来的分别是:
// 0023 #
// 002A *
// 0030..0039 0..9
// 1F1E6..1F1FF A..Z
// 从 http://unicode.org/Public/emoji/5.0/emoji-sequences.txt
// 可以看到这些多出来的码是什么样的 Emoji
// A..Z 之间相互组合成 AC 等,由于它们不是正常字符,所以我们后面加入特征码表中
// 1F1E6 1F1E8 ; Emoji_Flag_Sequence ; Ascension Island # 6.0 [1] (🇦🇨)
// 而 # * 0~9 这些字符本身是正常的字符,但是它们搭配其他的特征码则变成了 Emoji
// # Emoji Keycap Sequence
// 0023 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: \x{23} # 3.0 [1] (#️⃣)
// 002A FE0F 20E3; Emoji_Keycap_Sequence ; keycap: * # 3.0 [1] (*️⃣)
// 0030 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 0 # 3.0 [1] (0️⃣)
// 0031 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 1 # 3.0 [1] (1️⃣)
// 0032 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 2 # 3.0 [1] (2️⃣)
// 0033 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 3 # 3.0 [1] (3️⃣)
// 0034 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 4 # 3.0 [1] (4️⃣)
// 0035 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 5 # 3.0 [1] (5️⃣)
// 0036 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 6 # 3.0 [1] (6️⃣)
// 0037 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 7 # 3.0 [1] (7️⃣)
// 0038 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 8 # 3.0 [1] (8️⃣)
// 0039 FE0F 20E3; Emoji_Keycap_Sequence ; keycap: 9 # 3.0 [1] (9️⃣)
// addUnicodeToSet(emojiSignatureSet, 0x0023);
// addUnicodeToSet(emojiSignatureSet, 0x002A);
// addUnicodeToSet(emojiSignatureSet, 0x0030, 0x0039);
addUnicodeToSet(emojiSignatureSet, 0x00A9);
addUnicodeToSet(emojiSignatureSet, 0x00AE);
addUnicodeToSet(emojiSignatureSet, 0x203C);
addUnicodeToSet(emojiSignatureSet, 0x2049);
addUnicodeToSet(emojiSignatureSet, 0x2122);
addUnicodeToSet(emojiSignatureSet, 0x2139);
addUnicodeToSet(emojiSignatureSet, 0x2194, 0x2199);
addUnicodeToSet(emojiSignatureSet, 0x21A9, 0x21AA);
addUnicodeToSet(emojiSignatureSet, 0x231A, 0x231B);
addUnicodeToSet(emojiSignatureSet, 0x2328);
addUnicodeToSet(emojiSignatureSet, 0x23CF);
addUnicodeToSet(emojiSignatureSet, 0x23E9, 0x23F3);
addUnicodeToSet(emojiSignatureSet, 0x23F8, 0x23FA);
addUnicodeToSet(emojiSignatureSet, 0x24C2);
addUnicodeToSet(emojiSignatureSet, 0x25AA, 0x25AB);
addUnicodeToSet(emojiSignatureSet, 0x25B6);
addUnicodeToSet(emojiSignatureSet, 0x25C0);
addUnicodeToSet(emojiSignatureSet, 0x25FB, 0x25FE);
addUnicodeToSet(emojiSignatureSet, 0x2600, 0x2604);
addUnicodeToSet(emojiSignatureSet, 0x260E);
addUnicodeToSet(emojiSignatureSet, 0x2611);
addUnicodeToSet(emojiSignatureSet, 0x2614, 0x2615);
addUnicodeToSet(emojiSignatureSet, 0x2618);
addUnicodeToSet(emojiSignatureSet, 0x261D);
addUnicodeToSet(emojiSignatureSet, 0x2620);
addUnicodeToSet(emojiSignatureSet, 0x2622, 0x2623);
addUnicodeToSet(emojiSignatureSet, 0x2626);
addUnicodeToSet(emojiSignatureSet, 0x262A);
addUnicodeToSet(emojiSignatureSet, 0x262E, 0x262F);
addUnicodeToSet(emojiSignatureSet, 0x2638, 0x263A);
addUnicodeToSet(emojiSignatureSet, 0x2640);
addUnicodeToSet(emojiSignatureSet, 0x2642);
addUnicodeToSet(emojiSignatureSet, 0x2648, 0x2653);
addUnicodeToSet(emojiSignatureSet, 0x265F, 0x2660);
addUnicodeToSet(emojiSignatureSet, 0x2663);
addUnicodeToSet(emojiSignatureSet, 0x2665, 0x2666);
addUnicodeToSet(emojiSignatureSet, 0x2668);
addUnicodeToSet(emojiSignatureSet, 0x267B);
addUnicodeToSet(emojiSignatureSet, 0x267E, 0x267F);
addUnicodeToSet(emojiSignatureSet, 0x2692, 0x2697);
addUnicodeToSet(emojiSignatureSet, 0x2699);
addUnicodeToSet(emojiSignatureSet, 0x269B, 0x269C);
addUnicodeToSet(emojiSignatureSet, 0x26A0, 0x26A1);
addUnicodeToSet(emojiSignatureSet, 0x26AA, 0x26AB);
addUnicodeToSet(emojiSignatureSet, 0x26B0, 0x26B1);
addUnicodeToSet(emojiSignatureSet, 0x26BD, 0x26BE);
addUnicodeToSet(emojiSignatureSet, 0x26C4, 0x26C5);
addUnicodeToSet(emojiSignatureSet, 0x26C8);
addUnicodeToSet(emojiSignatureSet, 0x26CE);
addUnicodeToSet(emojiSignatureSet, 0x26CF);
addUnicodeToSet(emojiSignatureSet, 0x26D1);
addUnicodeToSet(emojiSignatureSet, 0x26D3, 0x26D4);
addUnicodeToSet(emojiSignatureSet, 0x26E9, 0x26EA);
addUnicodeToSet(emojiSignatureSet, 0x26F0, 0x26F5);
addUnicodeToSet(emojiSignatureSet, 0x26F7, 0x26FA);
addUnicodeToSet(emojiSignatureSet, 0x26FD);
addUnicodeToSet(emojiSignatureSet, 0x2702);
addUnicodeToSet(emojiSignatureSet, 0x2705);
addUnicodeToSet(emojiSignatureSet, 0x2708, 0x2709);
addUnicodeToSet(emojiSignatureSet, 0x270A, 0x270B);
addUnicodeToSet(emojiSignatureSet, 0x270C, 0x270D);
addUnicodeToSet(emojiSignatureSet, 0x270F);
addUnicodeToSet(emojiSignatureSet, 0x2712);
addUnicodeToSet(emojiSignatureSet, 0x2714);
addUnicodeToSet(emojiSignatureSet, 0x2716);
addUnicodeToSet(emojiSignatureSet, 0x271D);
addUnicodeToSet(emojiSignatureSet, 0x2721);
addUnicodeToSet(emojiSignatureSet, 0x2728);
addUnicodeToSet(emojiSignatureSet, 0x2733, 0x2734);
addUnicodeToSet(emojiSignatureSet, 0x2744);
addUnicodeToSet(emojiSignatureSet, 0x2747);
addUnicodeToSet(emojiSignatureSet, 0x274C);
addUnicodeToSet(emojiSignatureSet, 0x274E);
addUnicodeToSet(emojiSignatureSet, 0x2753, 0x2755);
addUnicodeToSet(emojiSignatureSet, 0x2757);
addUnicodeToSet(emojiSignatureSet, 0x2763, 0x2764);
addUnicodeToSet(emojiSignatureSet, 0x2795, 0x2797);
addUnicodeToSet(emojiSignatureSet, 0x27A1);
addUnicodeToSet(emojiSignatureSet, 0x27B0);
addUnicodeToSet(emojiSignatureSet, 0x27BF);
addUnicodeToSet(emojiSignatureSet, 0x2934, 0x2935);
addUnicodeToSet(emojiSignatureSet, 0x2B05, 0x2B07);
addUnicodeToSet(emojiSignatureSet, 0x2B1B, 0x2B1C);
addUnicodeToSet(emojiSignatureSet, 0x2B50);
addUnicodeToSet(emojiSignatureSet, 0x2B55);
addUnicodeToSet(emojiSignatureSet, 0x3030);
addUnicodeToSet(emojiSignatureSet, 0x303D);
addUnicodeToSet(emojiSignatureSet, 0x3297);
addUnicodeToSet(emojiSignatureSet, 0x3299);
addUnicodeToSet(emojiSignatureSet, 0x1F004);
addUnicodeToSet(emojiSignatureSet, 0x1F0CF);
addUnicodeToSet(emojiSignatureSet, 0x1F170, 0x1F171);
addUnicodeToSet(emojiSignatureSet, 0x1F17E);
addUnicodeToSet(emojiSignatureSet, 0x1F17F);
addUnicodeToSet(emojiSignatureSet, 0x1F18E);
addUnicodeToSet(emojiSignatureSet, 0x1F191, 0x1F19A);
// 1F1E6 1F1E8 ; Emoji_Flag_Sequence ; Ascension Island # 6.0 [1] (🇦🇨)
// addUnicodeToSet(emojiSignatureSet, 0x1F1E6, 0x1F1FF);
addUnicodeToSet(emojiSignatureSet, 0x1F201, 0x1F202);
addUnicodeToSet(emojiSignatureSet, 0x1F21A);
addUnicodeToSet(emojiSignatureSet, 0x1F22F);
addUnicodeToSet(emojiSignatureSet, 0x1F232, 0x1F23A);
addUnicodeToSet(emojiSignatureSet, 0x1F250, 0x1F251);
addUnicodeToSet(emojiSignatureSet, 0x1F300, 0x1F320);
addUnicodeToSet(emojiSignatureSet, 0x1F321);
addUnicodeToSet(emojiSignatureSet, 0x1F324, 0x1F32C);
addUnicodeToSet(emojiSignatureSet, 0x1F32D, 0x1F32F);
addUnicodeToSet(emojiSignatureSet, 0x1F330, 0x1F335);
addUnicodeToSet(emojiSignatureSet, 0x1F336);
addUnicodeToSet(emojiSignatureSet, 0x1F337, 0x1F37C);
addUnicodeToSet(emojiSignatureSet, 0x1F37D);
addUnicodeToSet(emojiSignatureSet, 0x1F37E, 0x1F37F);
addUnicodeToSet(emojiSignatureSet, 0x1F380, 0x1F393);
addUnicodeToSet(emojiSignatureSet, 0x1F396, 0x1F397);
addUnicodeToSet(emojiSignatureSet, 0x1F399, 0x1F39B);
addUnicodeToSet(emojiSignatureSet, 0x1F39E, 0x1F39F);
addUnicodeToSet(emojiSignatureSet, 0x1F3A0, 0x1F3C4);
addUnicodeToSet(emojiSignatureSet, 0x1F3C5);
addUnicodeToSet(emojiSignatureSet, 0x1F3C6, 0x1F3CA);
addUnicodeToSet(emojiSignatureSet, 0x1F3CB, 0x1F3CE);
addUnicodeToSet(emojiSignatureSet, 0x1F3CF, 0x1F3D3);
addUnicodeToSet(emojiSignatureSet, 0x1F3D4, 0x1F3DF);
addUnicodeToSet(emojiSignatureSet, 0x1F3E0, 0x1F3F0);
addUnicodeToSet(emojiSignatureSet, 0x1F3F3, 0x1F3F5);
addUnicodeToSet(emojiSignatureSet, 0x1F3F7);
addUnicodeToSet(emojiSignatureSet, 0x1F3F8, 0x1F3FF);
addUnicodeToSet(emojiSignatureSet, 0x1F400, 0x1F43E);
addUnicodeToSet(emojiSignatureSet, 0x1F43F);
addUnicodeToSet(emojiSignatureSet, 0x1F440);
addUnicodeToSet(emojiSignatureSet, 0x1F441);
addUnicodeToSet(emojiSignatureSet, 0x1F442, 0x1F4F7);
addUnicodeToSet(emojiSignatureSet, 0x1F4F8);
addUnicodeToSet(emojiSignatureSet, 0x1F4F9, 0x1F4FC);
addUnicodeToSet(emojiSignatureSet, 0x1F4FD);
addUnicodeToSet(emojiSignatureSet, 0x1F4FF);
addUnicodeToSet(emojiSignatureSet, 0x1F500, 0x1F53D);
addUnicodeToSet(emojiSignatureSet, 0x1F549, 0x1F54A);
addUnicodeToSet(emojiSignatureSet, 0x1F54B, 0x1F54E);
addUnicodeToSet(emojiSignatureSet, 0x1F550, 0x1F567);
addUnicodeToSet(emojiSignatureSet, 0x1F56F, 0x1F570);
addUnicodeToSet(emojiSignatureSet, 0x1F573, 0x1F579);
addUnicodeToSet(emojiSignatureSet, 0x1F57A);
addUnicodeToSet(emojiSignatureSet, 0x1F587);
addUnicodeToSet(emojiSignatureSet, 0x1F58A, 0x1F58D);
addUnicodeToSet(emojiSignatureSet, 0x1F590);
addUnicodeToSet(emojiSignatureSet, 0x1F595, 0x1F596);
addUnicodeToSet(emojiSignatureSet, 0x1F5A4);
addUnicodeToSet(emojiSignatureSet, 0x1F5A5);
addUnicodeToSet(emojiSignatureSet, 0x1F5A8);
addUnicodeToSet(emojiSignatureSet, 0x1F5B1, 0x1F5B2);
addUnicodeToSet(emojiSignatureSet, 0x1F5BC);
addUnicodeToSet(emojiSignatureSet, 0x1F5C2, 0x1F5C4);
addUnicodeToSet(emojiSignatureSet, 0x1F5D1, 0x1F5D3);
addUnicodeToSet(emojiSignatureSet, 0x1F5DC, 0x1F5DE);
addUnicodeToSet(emojiSignatureSet, 0x1F5E1);
addUnicodeToSet(emojiSignatureSet, 0x1F5E3);
addUnicodeToSet(emojiSignatureSet, 0x1F5E8);
addUnicodeToSet(emojiSignatureSet, 0x1F5EF);
addUnicodeToSet(emojiSignatureSet, 0x1F5F3);
addUnicodeToSet(emojiSignatureSet, 0x1F5FA);
addUnicodeToSet(emojiSignatureSet, 0x1F5FB, 0x1F5FF);
addUnicodeToSet(emojiSignatureSet, 0x1F600);
addUnicodeToSet(emojiSignatureSet, 0x1F601, 0x1F610);
addUnicodeToSet(emojiSignatureSet, 0x1F611);
addUnicodeToSet(emojiSignatureSet, 0x1F612, 0x1F614);
addUnicodeToSet(emojiSignatureSet, 0x1F615);
addUnicodeToSet(emojiSignatureSet, 0x1F616);
addUnicodeToSet(emojiSignatureSet, 0x1F617);
addUnicodeToSet(emojiSignatureSet, 0x1F618);
addUnicodeToSet(emojiSignatureSet, 0x1F619);
addUnicodeToSet(emojiSignatureSet, 0x1F61A);
addUnicodeToSet(emojiSignatureSet, 0x1F61B);
addUnicodeToSet(emojiSignatureSet, 0x1F61C, 0x1F61E);
addUnicodeToSet(emojiSignatureSet, 0x1F61F);
addUnicodeToSet(emojiSignatureSet, 0x1F620, 0x1F625);
addUnicodeToSet(emojiSignatureSet, 0x1F626, 0x1F627);
addUnicodeToSet(emojiSignatureSet, 0x1F628, 0x1F62B);
addUnicodeToSet(emojiSignatureSet, 0x1F62C);
addUnicodeToSet(emojiSignatureSet, 0x1F62D);
addUnicodeToSet(emojiSignatureSet, 0x1F62E, 0x1F62F);
addUnicodeToSet(emojiSignatureSet, 0x1F630, 0x1F633);
addUnicodeToSet(emojiSignatureSet, 0x1F634);
addUnicodeToSet(emojiSignatureSet, 0x1F635, 0x1F640);
addUnicodeToSet(emojiSignatureSet, 0x1F641, 0x1F642);
addUnicodeToSet(emojiSignatureSet, 0x1F643, 0x1F644);
addUnicodeToSet(emojiSignatureSet, 0x1F645, 0x1F64F);
addUnicodeToSet(emojiSignatureSet, 0x1F680, 0x1F6C5);
addUnicodeToSet(emojiSignatureSet, 0x1F6CB, 0x1F6CF);
addUnicodeToSet(emojiSignatureSet, 0x1F6D0);
addUnicodeToSet(emojiSignatureSet, 0x1F6D1, 0x1F6D2);
addUnicodeToSet(emojiSignatureSet, 0x1F6E0, 0x1F6E5);
addUnicodeToSet(emojiSignatureSet, 0x1F6E9);
addUnicodeToSet(emojiSignatureSet, 0x1F6EB, 0x1F6EC);
addUnicodeToSet(emojiSignatureSet, 0x1F6F0);
addUnicodeToSet(emojiSignatureSet, 0x1F6F3);
addUnicodeToSet(emojiSignatureSet, 0x1F6F4, 0x1F6F6);
addUnicodeToSet(emojiSignatureSet, 0x1F6F7, 0x1F6F8);
addUnicodeToSet(emojiSignatureSet, 0x1F6F9);
addUnicodeToSet(emojiSignatureSet, 0x1F910, 0x1F918);
addUnicodeToSet(emojiSignatureSet, 0x1F919, 0x1F91E);
addUnicodeToSet(emojiSignatureSet, 0x1F91F);
addUnicodeToSet(emojiSignatureSet, 0x1F920, 0x1F927);
addUnicodeToSet(emojiSignatureSet, 0x1F928, 0x1F92F);
addUnicodeToSet(emojiSignatureSet, 0x1F930);
addUnicodeToSet(emojiSignatureSet, 0x1F931, 0x1F932);
addUnicodeToSet(emojiSignatureSet, 0x1F933, 0x1F93A);
addUnicodeToSet(emojiSignatureSet, 0x1F93C, 0x1F93E);
addUnicodeToSet(emojiSignatureSet, 0x1F940, 0x1F945);
addUnicodeToSet(emojiSignatureSet, 0x1F947, 0x1F94B);
addUnicodeToSet(emojiSignatureSet, 0x1F94C);
addUnicodeToSet(emojiSignatureSet, 0x1F94D, 0x1F94F);
addUnicodeToSet(emojiSignatureSet, 0x1F950, 0x1F95E);
addUnicodeToSet(emojiSignatureSet, 0x1F95F, 0x1F96B);
addUnicodeToSet(emojiSignatureSet, 0x1F96C, 0x1F970);
addUnicodeToSet(emojiSignatureSet, 0x1F973, 0x1F976);
addUnicodeToSet(emojiSignatureSet, 0x1F97A);
addUnicodeToSet(emojiSignatureSet, 0x1F97C, 0x1F97F);
addUnicodeToSet(emojiSignatureSet, 0x1F980, 0x1F984);
addUnicodeToSet(emojiSignatureSet, 0x1F985, 0x1F991);
addUnicodeToSet(emojiSignatureSet, 0x1F992, 0x1F997);
addUnicodeToSet(emojiSignatureSet, 0x1F998, 0x1F9A2);
addUnicodeToSet(emojiSignatureSet, 0x1F9B0, 0x1F9B9);
addUnicodeToSet(emojiSignatureSet, 0x1F9C0);
addUnicodeToSet(emojiSignatureSet, 0x1F9C1, 0x1F9C2);
addUnicodeToSet(emojiSignatureSet, 0x1F9D0, 0x1F9E6);
addUnicodeToSet(emojiSignatureSet, 0x1F9E7, 0x1F9FF);
// 以上为 https://en.wikipedia.org/wiki/Emoji 列出的 1212 个 Emoji
addUnicodeToSet(emojiSignatureSet, 0x1F1E6, 0x1F1FF);

// -------------------------------------------------------------------
// 以下这部分则是 emoji-data.txt 完整的部分。
// 与上面列出的相比,多了一些杂项符号,zwj、肤色、发色的组合符号,去除了保留字符
// -------------------------------------------------------------------
addUnicodeToSet(emojiSignatureSet, 0x231A, 0x231B);
addUnicodeToSet(emojiSignatureSet, 0x23E9, 0x23EC);
addUnicodeToSet(emojiSignatureSet, 0x23F0);
addUnicodeToSet(emojiSignatureSet, 0x23F3);
addUnicodeToSet(emojiSignatureSet, 0x25FD, 0x25FE);
addUnicodeToSet(emojiSignatureSet, 0x2614, 0x2615);
addUnicodeToSet(emojiSignatureSet, 0x2648, 0x2653);
addUnicodeToSet(emojiSignatureSet, 0x267F);
addUnicodeToSet(emojiSignatureSet, 0x2693);
addUnicodeToSet(emojiSignatureSet, 0x26A1);
addUnicodeToSet(emojiSignatureSet, 0x26AA, 0x26AB);
addUnicodeToSet(emojiSignatureSet, 0x26BD, 0x26BE);
addUnicodeToSet(emojiSignatureSet, 0x26C4, 0x26C5);
addUnicodeToSet(emojiSignatureSet, 0x26CE);
addUnicodeToSet(emojiSignatureSet, 0x26D4);
addUnicodeToSet(emojiSignatureSet, 0x26EA);
addUnicodeToSet(emojiSignatureSet, 0x26F2, 0x26F3);
addUnicodeToSet(emojiSignatureSet, 0x26F5);
addUnicodeToSet(emojiSignatureSet, 0x26FA);
addUnicodeToSet(emojiSignatureSet, 0x26FD);
addUnicodeToSet(emojiSignatureSet, 0x2705);
addUnicodeToSet(emojiSignatureSet, 0x270A, 0x270B);
addUnicodeToSet(emojiSignatureSet, 0x2728);
addUnicodeToSet(emojiSignatureSet, 0x274C);
addUnicodeToSet(emojiSignatureSet, 0x274E);
addUnicodeToSet(emojiSignatureSet, 0x2753, 0x2755);
addUnicodeToSet(emojiSignatureSet, 0x2757);
addUnicodeToSet(emojiSignatureSet, 0x2795, 0x2797);
addUnicodeToSet(emojiSignatureSet, 0x27B0);
addUnicodeToSet(emojiSignatureSet, 0x27BF);
addUnicodeToSet(emojiSignatureSet, 0x2B1B, 0x2B1C);
addUnicodeToSet(emojiSignatureSet, 0x2B50);
addUnicodeToSet(emojiSignatureSet, 0x2B55);
addUnicodeToSet(emojiSignatureSet, 0x1F004);
addUnicodeToSet(emojiSignatureSet, 0x1F0CF);
addUnicodeToSet(emojiSignatureSet, 0x1F18E);
addUnicodeToSet(emojiSignatureSet, 0x1F191, 0x1F19A);
addUnicodeToSet(emojiSignatureSet, 0x1F1E6, 0x1F1FF);
addUnicodeToSet(emojiSignatureSet, 0x1F201);
addUnicodeToSet(emojiSignatureSet, 0x1F21A);
addUnicodeToSet(emojiSignatureSet, 0x1F22F);
addUnicodeToSet(emojiSignatureSet, 0x1F232, 0x1F236);
addUnicodeToSet(emojiSignatureSet, 0x1F238, 0x1F23A);
addUnicodeToSet(emojiSignatureSet, 0x1F250, 0x1F251);
addUnicodeToSet(emojiSignatureSet, 0x1F300, 0x1F320);
addUnicodeToSet(emojiSignatureSet, 0x1F32D, 0x1F32F);
addUnicodeToSet(emojiSignatureSet, 0x1F330, 0x1F335);
addUnicodeToSet(emojiSignatureSet, 0x1F337, 0x1F37C);
addUnicodeToSet(emojiSignatureSet, 0x1F37E, 0x1F37F);
addUnicodeToSet(emojiSignatureSet, 0x1F380, 0x1F393);
addUnicodeToSet(emojiSignatureSet, 0x1F3A0, 0x1F3C4);
addUnicodeToSet(emojiSignatureSet, 0x1F3C5);
addUnicodeToSet(emojiSignatureSet, 0x1F3C6, 0x1F3CA);
addUnicodeToSet(emojiSignatureSet, 0x1F3CF, 0x1F3D3);
addUnicodeToSet(emojiSignatureSet, 0x1F3E0, 0x1F3F0);
addUnicodeToSet(emojiSignatureSet, 0x1F3F4);
addUnicodeToSet(emojiSignatureSet, 0x1F3F8, 0x1F3FF);
addUnicodeToSet(emojiSignatureSet, 0x1F400, 0x1F43E);
addUnicodeToSet(emojiSignatureSet, 0x1F440);
addUnicodeToSet(emojiSignatureSet, 0x1F442, 0x1F4F7);
addUnicodeToSet(emojiSignatureSet, 0x1F4F8);
addUnicodeToSet(emojiSignatureSet, 0x1F4F9, 0x1F4FC);
addUnicodeToSet(emojiSignatureSet, 0x1F4FF);
addUnicodeToSet(emojiSignatureSet, 0x1F500, 0x1F53D);
addUnicodeToSet(emojiSignatureSet, 0x1F54B, 0x1F54E);
addUnicodeToSet(emojiSignatureSet, 0x1F550, 0x1F567);
addUnicodeToSet(emojiSignatureSet, 0x1F57A);
addUnicodeToSet(emojiSignatureSet, 0x1F595, 0x1F596);
addUnicodeToSet(emojiSignatureSet, 0x1F5A4);
addUnicodeToSet(emojiSignatureSet, 0x1F5FB, 0x1F5FF);
addUnicodeToSet(emojiSignatureSet, 0x1F600);
addUnicodeToSet(emojiSignatureSet, 0x1F601, 0x1F610);
addUnicodeToSet(emojiSignatureSet, 0x1F611);
addUnicodeToSet(emojiSignatureSet, 0x1F612, 0x1F614);
addUnicodeToSet(emojiSignatureSet, 0x1F615);
addUnicodeToSet(emojiSignatureSet, 0x1F616);
addUnicodeToSet(emojiSignatureSet, 0x1F617);
addUnicodeToSet(emojiSignatureSet, 0x1F618);
addUnicodeToSet(emojiSignatureSet, 0x1F619);
addUnicodeToSet(emojiSignatureSet, 0x1F61A);
addUnicodeToSet(emojiSignatureSet, 0x1F61B);
addUnicodeToSet(emojiSignatureSet, 0x1F61C, 0x1F61E);
addUnicodeToSet(emojiSignatureSet, 0x1F61F);
addUnicodeToSet(emojiSignatureSet, 0x1F620, 0x1F625);
addUnicodeToSet(emojiSignatureSet, 0x1F626, 0x1F627);
addUnicodeToSet(emojiSignatureSet, 0x1F628, 0x1F62B);
addUnicodeToSet(emojiSignatureSet, 0x1F62C);
addUnicodeToSet(emojiSignatureSet, 0x1F62D);
addUnicodeToSet(emojiSignatureSet, 0x1F62E, 0x1F62F);
addUnicodeToSet(emojiSignatureSet, 0x1F630, 0x1F633);
addUnicodeToSet(emojiSignatureSet, 0x1F634);
addUnicodeToSet(emojiSignatureSet, 0x1F635, 0x1F640);
addUnicodeToSet(emojiSignatureSet, 0x1F641, 0x1F642);
addUnicodeToSet(emojiSignatureSet, 0x1F643, 0x1F644);
addUnicodeToSet(emojiSignatureSet, 0x1F645, 0x1F64F);
addUnicodeToSet(emojiSignatureSet, 0x1F680, 0x1F6C5);
addUnicodeToSet(emojiSignatureSet, 0x1F6CC);
addUnicodeToSet(emojiSignatureSet, 0x1F6D0);
addUnicodeToSet(emojiSignatureSet, 0x1F6D1, 0x1F6D2);
addUnicodeToSet(emojiSignatureSet, 0x1F6EB, 0x1F6EC);
addUnicodeToSet(emojiSignatureSet, 0x1F6F4, 0x1F6F6);
addUnicodeToSet(emojiSignatureSet, 0x1F6F7, 0x1F6F8);
addUnicodeToSet(emojiSignatureSet, 0x1F6F9);
addUnicodeToSet(emojiSignatureSet, 0x1F910, 0x1F918);
addUnicodeToSet(emojiSignatureSet, 0x1F919, 0x1F91E);
addUnicodeToSet(emojiSignatureSet, 0x1F91F);
addUnicodeToSet(emojiSignatureSet, 0x1F920, 0x1F927);
addUnicodeToSet(emojiSignatureSet, 0x1F928, 0x1F92F);
addUnicodeToSet(emojiSignatureSet, 0x1F930);
addUnicodeToSet(emojiSignatureSet, 0x1F931, 0x1F932);
addUnicodeToSet(emojiSignatureSet, 0x1F933, 0x1F93A);
addUnicodeToSet(emojiSignatureSet, 0x1F93C, 0x1F93E);
addUnicodeToSet(emojiSignatureSet, 0x1F940, 0x1F945);
addUnicodeToSet(emojiSignatureSet, 0x1F947, 0x1F94B);
addUnicodeToSet(emojiSignatureSet, 0x1F94C);
addUnicodeToSet(emojiSignatureSet, 0x1F94D, 0x1F94F);
addUnicodeToSet(emojiSignatureSet, 0x1F950, 0x1F95E);
addUnicodeToSet(emojiSignatureSet, 0x1F95F, 0x1F96B);
addUnicodeToSet(emojiSignatureSet, 0x1F96C, 0x1F970);
addUnicodeToSet(emojiSignatureSet, 0x1F973, 0x1F976);
addUnicodeToSet(emojiSignatureSet, 0x1F97A);
addUnicodeToSet(emojiSignatureSet, 0x1F97C, 0x1F97F);
addUnicodeToSet(emojiSignatureSet, 0x1F980, 0x1F984);
addUnicodeToSet(emojiSignatureSet, 0x1F985, 0x1F991);
addUnicodeToSet(emojiSignatureSet, 0x1F992, 0x1F997);
addUnicodeToSet(emojiSignatureSet, 0x1F998, 0x1F9A2);
addUnicodeToSet(emojiSignatureSet, 0x1F9B0, 0x1F9B9);
addUnicodeToSet(emojiSignatureSet, 0x1F9C0);
addUnicodeToSet(emojiSignatureSet, 0x1F9C1, 0x1F9C2);
addUnicodeToSet(emojiSignatureSet, 0x1F9D0, 0x1F9E6);
addUnicodeToSet(emojiSignatureSet, 0x1F9E7, 0x1F9FF);
addUnicodeToSet(emojiSignatureSet, 0x1F3FB, 0x1F3FF);
addUnicodeToSet(emojiSignatureSet, 0x261D);
addUnicodeToSet(emojiSignatureSet, 0x26F9);
addUnicodeToSet(emojiSignatureSet, 0x270A, 0x270B);
addUnicodeToSet(emojiSignatureSet, 0x270C, 0x270D);
addUnicodeToSet(emojiSignatureSet, 0x1F385);
addUnicodeToSet(emojiSignatureSet, 0x1F3C2, 0x1F3C4);
addUnicodeToSet(emojiSignatureSet, 0x1F3C7);
addUnicodeToSet(emojiSignatureSet, 0x1F3CA);
addUnicodeToSet(emojiSignatureSet, 0x1F3CB, 0x1F3CC);
addUnicodeToSet(emojiSignatureSet, 0x1F442, 0x1F443);
addUnicodeToSet(emojiSignatureSet, 0x1F446, 0x1F450);
addUnicodeToSet(emojiSignatureSet, 0x1F466, 0x1F469);
addUnicodeToSet(emojiSignatureSet, 0x1F46E);
addUnicodeToSet(emojiSignatureSet, 0x1F470, 0x1F478);
addUnicodeToSet(emojiSignatureSet, 0x1F47C);
addUnicodeToSet(emojiSignatureSet, 0x1F481, 0x1F483);
addUnicodeToSet(emojiSignatureSet, 0x1F485, 0x1F487);
addUnicodeToSet(emojiSignatureSet, 0x1F4AA);
addUnicodeToSet(emojiSignatureSet, 0x1F574, 0x1F575);
addUnicodeToSet(emojiSignatureSet, 0x1F57A);
addUnicodeToSet(emojiSignatureSet, 0x1F590);
addUnicodeToSet(emojiSignatureSet, 0x1F595, 0x1F596);
addUnicodeToSet(emojiSignatureSet, 0x1F645, 0x1F647);
addUnicodeToSet(emojiSignatureSet, 0x1F64B, 0x1F64F);
addUnicodeToSet(emojiSignatureSet, 0x1F6A3);
addUnicodeToSet(emojiSignatureSet, 0x1F6B4, 0x1F6B6);
addUnicodeToSet(emojiSignatureSet, 0x1F6C0);
addUnicodeToSet(emojiSignatureSet, 0x1F6CC);
addUnicodeToSet(emojiSignatureSet, 0x1F918);
addUnicodeToSet(emojiSignatureSet, 0x1F919, 0x1F91C);
addUnicodeToSet(emojiSignatureSet, 0x1F91E);
addUnicodeToSet(emojiSignatureSet, 0x1F91F);
addUnicodeToSet(emojiSignatureSet, 0x1F926);
addUnicodeToSet(emojiSignatureSet, 0x1F930);
addUnicodeToSet(emojiSignatureSet, 0x1F931, 0x1F932);
addUnicodeToSet(emojiSignatureSet, 0x1F933, 0x1F939);
addUnicodeToSet(emojiSignatureSet, 0x1F93D, 0x1F93E);
addUnicodeToSet(emojiSignatureSet, 0x1F9B5, 0x1F9B6);
addUnicodeToSet(emojiSignatureSet, 0x1F9B8, 0x1F9B9);
addUnicodeToSet(emojiSignatureSet, 0x1F9D1, 0x1F9DD);

// 0023 ; Emoji_Component # 1.1 [1] (#️) number sign
// 002A ; Emoji_Component # 1.1 [1] (*️) asterisk
// 0030..0039 ; Emoji_Component # 1.1 [10] (0️..9️) digit zero..digit nine
// 上面说了这 #*0~9都是正常字符,只是和 20E3 FE0F组合起来变成了 Emoji, 所以把以下两个加入特征码
// 20E3 ; Emoji_Component # 3.0 [1] (⃣) combining enclosing keycap
// FE0F ; Emoji_Component # 3.2 [1] () VARIATION SELECTOR-16
addUnicodeToSet(emojiSignatureSet, 0x20E3);
addUnicodeToSet(emojiSignatureSet, 0XFE0F);
// 与之相似的 VARIATION SELECTOR-15
addUnicodeToSet(emojiSignatureSet, 0XFE0E);

// 200D ; Emoji_Component # 1.1 [1] (‍) zero width joiner
// 这个是将多个Emoji拼接成一个Emoji,在支持的机器上可以显示。zwj
addUnicodeToSet(emojiSignatureSet, 0x200D);

// 1F1E6..1F1FF ; Emoji # 6.0 [26] (🇦..🇿)
// regional indicator symbol letter a..regional indicator symbol letter z
// A..Z 之间相互组合成 AC 等
// 1F1E6 1F1E8 ; Emoji_Flag_Sequence ; Ascension Island # 6.0 [1] (🇦🇨)
addUnicodeToSet(emojiSignatureSet, 0x1F1E6, 0x1F1FF);
// 1F3FB..1F3FF ; Emoji_Modifier # 8.0 [5] (🏻..🏿) light skin tone..dark skin tone
// 用来表示肤色,这里是重复添加,第一部分已经添加过了
addUnicodeToSet(emojiSignatureSet, 0x1F3FB, 0x1F3FF);
// 1F9B0..1F9B3 ; Emoji_Component # 11.0 [4] (🦰..🦳) red-haired..white-haired
// 表示发色, 这里也是重复添加了,第一部分已经添加过了
addUnicodeToSet(emojiSignatureSet, 0x1F9B0, 0x1F9B3);
// E0020..E007F ; Emoji_Component # 3.1 [96] (󠀠..󠁿) tag space..cancel tag
// 根据 https://en.wikipedia.org/wiki/Tags_(Unicode_block)
// http://unicode.org/Public/emoji/5.0/emoji-sequences.txt
// E0020 ~ E007F 的使用仅有
// # Emoji Tag Sequence: See Annex C of TR51 for more information.
// 1F3F4 E0067 E0062 E0065 E006E E0067 E007F; Emoji_Tag_Sequence; England # 7.0 [1] (🏴󠁧󠁢󠁥󠁮󠁧󠁿)
// 1F3F4 E0067 E0062 E0073 E0063 E0074 E007F; Emoji_Tag_Sequence; Scotland # 7.0 [1] (🏴󠁧󠁢󠁳󠁣󠁴󠁿)
// 1F3F4 E0067 E0062 E0077 E006C E0073 E007F; Emoji_Tag_Sequence; Wales # 7.0 [1] (🏴󠁧󠁢󠁷󠁬󠁳󠁿)
// 1F3F4 已经是特征Emoji了,所以就不再添加,且这些覆盖了a~z及一些符号,如果添加了反而会误判
// 或者仅添加 E007F 作为 Emoji 特征码
addUnicodeToSet(emojiSignatureSet, 0xE007F);

addUnicodeToSet(emojiSignatureSet, 0x00A9);
addUnicodeToSet(emojiSignatureSet, 0x00AE);
addUnicodeToSet(emojiSignatureSet, 0x203C);
addUnicodeToSet(emojiSignatureSet, 0x2049);
addUnicodeToSet(emojiSignatureSet, 0x2122);
addUnicodeToSet(emojiSignatureSet, 0x2139);
addUnicodeToSet(emojiSignatureSet, 0x2194, 0x2199);
addUnicodeToSet(emojiSignatureSet, 0x21A9, 0x21AA);
addUnicodeToSet(emojiSignatureSet, 0x231A, 0x231B);
addUnicodeToSet(emojiSignatureSet, 0x2328);
addUnicodeToSet(emojiSignatureSet, 0x2388);
addUnicodeToSet(emojiSignatureSet, 0x23CF);
addUnicodeToSet(emojiSignatureSet, 0x23E9, 0x23F3);
addUnicodeToSet(emojiSignatureSet, 0x23F8, 0x23FA);
addUnicodeToSet(emojiSignatureSet, 0x24C2);
addUnicodeToSet(emojiSignatureSet, 0x25AA, 0x25AB);
addUnicodeToSet(emojiSignatureSet, 0x25B6);
addUnicodeToSet(emojiSignatureSet, 0x25C0);
addUnicodeToSet(emojiSignatureSet, 0x25FB, 0x25FE);
addUnicodeToSet(emojiSignatureSet, 0x2600, 0x2605);
addUnicodeToSet(emojiSignatureSet, 0x2607, 0x2612);
addUnicodeToSet(emojiSignatureSet, 0x2614, 0x2615);
addUnicodeToSet(emojiSignatureSet, 0x2616, 0x2617);
addUnicodeToSet(emojiSignatureSet, 0x2618);
addUnicodeToSet(emojiSignatureSet, 0x2619);
addUnicodeToSet(emojiSignatureSet, 0x261A, 0x266F);
addUnicodeToSet(emojiSignatureSet, 0x2670, 0x2671);
addUnicodeToSet(emojiSignatureSet, 0x2672, 0x267D);
addUnicodeToSet(emojiSignatureSet, 0x267E, 0x267F);
addUnicodeToSet(emojiSignatureSet, 0x2680, 0x2685);
addUnicodeToSet(emojiSignatureSet, 0x2690, 0x2691);
addUnicodeToSet(emojiSignatureSet, 0x2692, 0x269C);
addUnicodeToSet(emojiSignatureSet, 0x269D);
addUnicodeToSet(emojiSignatureSet, 0x269E, 0x269F);
addUnicodeToSet(emojiSignatureSet, 0x26A0, 0x26A1);
addUnicodeToSet(emojiSignatureSet, 0x26A2, 0x26B1);
addUnicodeToSet(emojiSignatureSet, 0x26B2);
addUnicodeToSet(emojiSignatureSet, 0x26B3, 0x26BC);
addUnicodeToSet(emojiSignatureSet, 0x26BD, 0x26BF);
addUnicodeToSet(emojiSignatureSet, 0x26C0, 0x26C3);
addUnicodeToSet(emojiSignatureSet, 0x26C4, 0x26CD);
addUnicodeToSet(emojiSignatureSet, 0x26CE);
addUnicodeToSet(emojiSignatureSet, 0x26CF, 0x26E1);
addUnicodeToSet(emojiSignatureSet, 0x26E2);
addUnicodeToSet(emojiSignatureSet, 0x26E3);
addUnicodeToSet(emojiSignatureSet, 0x26E4, 0x26E7);
addUnicodeToSet(emojiSignatureSet, 0x26E8, 0x26FF);
addUnicodeToSet(emojiSignatureSet, 0x2700);
addUnicodeToSet(emojiSignatureSet, 0x2701, 0x2704);
addUnicodeToSet(emojiSignatureSet, 0x2705);
addUnicodeToSet(emojiSignatureSet, 0x2708, 0x2709);
addUnicodeToSet(emojiSignatureSet, 0x270A, 0x270B);
addUnicodeToSet(emojiSignatureSet, 0x270C, 0x2712);
addUnicodeToSet(emojiSignatureSet, 0x2714);
addUnicodeToSet(emojiSignatureSet, 0x2716);
addUnicodeToSet(emojiSignatureSet, 0x271D);
addUnicodeToSet(emojiSignatureSet, 0x2721);
addUnicodeToSet(emojiSignatureSet, 0x2728);
addUnicodeToSet(emojiSignatureSet, 0x2733, 0x2734);
addUnicodeToSet(emojiSignatureSet, 0x2744);
addUnicodeToSet(emojiSignatureSet, 0x2747);
addUnicodeToSet(emojiSignatureSet, 0x274C);
addUnicodeToSet(emojiSignatureSet, 0x274E);
addUnicodeToSet(emojiSignatureSet, 0x2753, 0x2755);
addUnicodeToSet(emojiSignatureSet, 0x2757);
addUnicodeToSet(emojiSignatureSet, 0x2763, 0x2767);
addUnicodeToSet(emojiSignatureSet, 0x2795, 0x2797);
addUnicodeToSet(emojiSignatureSet, 0x27A1);
addUnicodeToSet(emojiSignatureSet, 0x27B0);
addUnicodeToSet(emojiSignatureSet, 0x27BF);
addUnicodeToSet(emojiSignatureSet, 0x2934, 0x2935);
addUnicodeToSet(emojiSignatureSet, 0x2B05, 0x2B07);
addUnicodeToSet(emojiSignatureSet, 0x2B1B, 0x2B1C);
addUnicodeToSet(emojiSignatureSet, 0x2B50);
addUnicodeToSet(emojiSignatureSet, 0x2B55);
addUnicodeToSet(emojiSignatureSet, 0x3030);
addUnicodeToSet(emojiSignatureSet, 0x303D);
addUnicodeToSet(emojiSignatureSet, 0x3297);
addUnicodeToSet(emojiSignatureSet, 0x3299);
addUnicodeToSet(emojiSignatureSet, 0x1F000, 0x1F02B);
// 1F02C..1F02F ; Extended_Pictographic# NA [4] (🀬️..🀯️) <reserved-1F02C>..<reserved-1F02F>
// addUnicodeToSet(emojiSignatureSet, 0x1F02C, 0x1F02F);
addUnicodeToSet(emojiSignatureSet, 0x1F030, 0x1F093);
// addUnicodeToSet(emojiSignatureSet, 0x1F094, 0x1F09F);
addUnicodeToSet(emojiSignatureSet, 0x1F0A0, 0x1F0AE);
// addUnicodeToSet(emojiSignatureSet, 0x1F0AF, 0x1F0B0);
addUnicodeToSet(emojiSignatureSet, 0x1F0B1, 0x1F0BE);
addUnicodeToSet(emojiSignatureSet, 0x1F0BF);
// addUnicodeToSet(emojiSignatureSet, 0x1F0C0);
addUnicodeToSet(emojiSignatureSet, 0x1F0C1, 0x1F0CF);
// addUnicodeToSet(emojiSignatureSet, 0x1F0D0);
addUnicodeToSet(emojiSignatureSet, 0x1F0D1, 0x1F0DF);
addUnicodeToSet(emojiSignatureSet, 0x1F0E0, 0x1F0F5);
// addUnicodeToSet(emojiSignatureSet, 0x1F0F6, 0x1F0FF);
// addUnicodeToSet(emojiSignatureSet, 0x1F10D, 0x1F10F);
addUnicodeToSet(emojiSignatureSet, 0x1F12F);
// addUnicodeToSet(emojiSignatureSet, 0x1F16C, 0x1F16F);
addUnicodeToSet(emojiSignatureSet, 0x1F170, 0x1F171);
addUnicodeToSet(emojiSignatureSet, 0x1F17E);
addUnicodeToSet(emojiSignatureSet, 0x1F17F);
addUnicodeToSet(emojiSignatureSet, 0x1F18E);
addUnicodeToSet(emojiSignatureSet, 0x1F191, 0x1F19A);
// addUnicodeToSet(emojiSignatureSet, 0x1F1AD, 0x1F1E5);
addUnicodeToSet(emojiSignatureSet, 0x1F201, 0x1F202);
// addUnicodeToSet(emojiSignatureSet, 0x1F203, 0x1F20F);
addUnicodeToSet(emojiSignatureSet, 0x1F21A);
addUnicodeToSet(emojiSignatureSet, 0x1F22F);
addUnicodeToSet(emojiSignatureSet, 0x1F232, 0x1F23A);
// addUnicodeToSet(emojiSignatureSet, 0x1F23C, 0x1F23F);
// addUnicodeToSet(emojiSignatureSet, 0x1F249, 0x1F24F);
addUnicodeToSet(emojiSignatureSet, 0x1F250, 0x1F251);
// addUnicodeToSet(emojiSignatureSet, 0x1F252, 0x1F25F);
addUnicodeToSet(emojiSignatureSet, 0x1F260, 0x1F265);
// addUnicodeToSet(emojiSignatureSet, 0x1F266, 0x1F2FF);
addUnicodeToSet(emojiSignatureSet, 0x1F300, 0x1F320);
addUnicodeToSet(emojiSignatureSet, 0x1F321, 0x1F32C);
addUnicodeToSet(emojiSignatureSet, 0x1F32D, 0x1F32F);
addUnicodeToSet(emojiSignatureSet, 0x1F330, 0x1F335);
addUnicodeToSet(emojiSignatureSet, 0x1F336);
addUnicodeToSet(emojiSignatureSet, 0x1F337, 0x1F37C);
addUnicodeToSet(emojiSignatureSet, 0x1F37D);
addUnicodeToSet(emojiSignatureSet, 0x1F37E, 0x1F37F);
addUnicodeToSet(emojiSignatureSet, 0x1F380, 0x1F393);
addUnicodeToSet(emojiSignatureSet, 0x1F394, 0x1F39F);
addUnicodeToSet(emojiSignatureSet, 0x1F3A0, 0x1F3C4);
addUnicodeToSet(emojiSignatureSet, 0x1F3C5);
addUnicodeToSet(emojiSignatureSet, 0x1F3C6, 0x1F3CA);
addUnicodeToSet(emojiSignatureSet, 0x1F3CB, 0x1F3CE);
addUnicodeToSet(emojiSignatureSet, 0x1F3CF, 0x1F3D3);
addUnicodeToSet(emojiSignatureSet, 0x1F3D4, 0x1F3DF);
addUnicodeToSet(emojiSignatureSet, 0x1F3E0, 0x1F3F0);
addUnicodeToSet(emojiSignatureSet, 0x1F3F1, 0x1F3F7);
addUnicodeToSet(emojiSignatureSet, 0x1F3F8, 0x1F3FA);
addUnicodeToSet(emojiSignatureSet, 0x1F400, 0x1F43E);
addUnicodeToSet(emojiSignatureSet, 0x1F43F);
addUnicodeToSet(emojiSignatureSet, 0x1F440);
addUnicodeToSet(emojiSignatureSet, 0x1F441);
addUnicodeToSet(emojiSignatureSet, 0x1F442, 0x1F4F7);
addUnicodeToSet(emojiSignatureSet, 0x1F4F8);
addUnicodeToSet(emojiSignatureSet, 0x1F4F9, 0x1F4FC);
addUnicodeToSet(emojiSignatureSet, 0x1F4FD, 0x1F4FE);
addUnicodeToSet(emojiSignatureSet, 0x1F4FF);
addUnicodeToSet(emojiSignatureSet, 0x1F500, 0x1F53D);
addUnicodeToSet(emojiSignatureSet, 0x1F546, 0x1F54A);
addUnicodeToSet(emojiSignatureSet, 0x1F54B, 0x1F54F);
addUnicodeToSet(emojiSignatureSet, 0x1F550, 0x1F567);
addUnicodeToSet(emojiSignatureSet, 0x1F568, 0x1F579);
addUnicodeToSet(emojiSignatureSet, 0x1F57A);
addUnicodeToSet(emojiSignatureSet, 0x1F57B, 0x1F5A3);
addUnicodeToSet(emojiSignatureSet, 0x1F5A4);
addUnicodeToSet(emojiSignatureSet, 0x1F5A5, 0x1F5FA);
addUnicodeToSet(emojiSignatureSet, 0x1F5FB, 0x1F5FF);
addUnicodeToSet(emojiSignatureSet, 0x1F600);
addUnicodeToSet(emojiSignatureSet, 0x1F601, 0x1F610);
addUnicodeToSet(emojiSignatureSet, 0x1F611);
addUnicodeToSet(emojiSignatureSet, 0x1F612, 0x1F614);
addUnicodeToSet(emojiSignatureSet, 0x1F615);
addUnicodeToSet(emojiSignatureSet, 0x1F616);
addUnicodeToSet(emojiSignatureSet, 0x1F617);
addUnicodeToSet(emojiSignatureSet, 0x1F618);
addUnicodeToSet(emojiSignatureSet, 0x1F619);
addUnicodeToSet(emojiSignatureSet, 0x1F61A);
addUnicodeToSet(emojiSignatureSet, 0x1F61B);
addUnicodeToSet(emojiSignatureSet, 0x1F61C, 0x1F61E);
addUnicodeToSet(emojiSignatureSet, 0x1F61F);
addUnicodeToSet(emojiSignatureSet, 0x1F620, 0x1F625);
addUnicodeToSet(emojiSignatureSet, 0x1F626, 0x1F627);
addUnicodeToSet(emojiSignatureSet, 0x1F628, 0x1F62B);
addUnicodeToSet(emojiSignatureSet, 0x1F62C);
addUnicodeToSet(emojiSignatureSet, 0x1F62D);
addUnicodeToSet(emojiSignatureSet, 0x1F62E, 0x1F62F);
addUnicodeToSet(emojiSignatureSet, 0x1F630, 0x1F633);
addUnicodeToSet(emojiSignatureSet, 0x1F634);
addUnicodeToSet(emojiSignatureSet, 0x1F635, 0x1F640);
addUnicodeToSet(emojiSignatureSet, 0x1F641, 0x1F642);
addUnicodeToSet(emojiSignatureSet, 0x1F643, 0x1F644);
addUnicodeToSet(emojiSignatureSet, 0x1F645, 0x1F64F);
addUnicodeToSet(emojiSignatureSet, 0x1F680, 0x1F6C5);
addUnicodeToSet(emojiSignatureSet, 0x1F6C6, 0x1F6CF);
addUnicodeToSet(emojiSignatureSet, 0x1F6D0);
addUnicodeToSet(emojiSignatureSet, 0x1F6D1, 0x1F6D2);
addUnicodeToSet(emojiSignatureSet, 0x1F6D3, 0x1F6D4);
// addUnicodeToSet(emojiSignatureSet, 0x1F6D5, 0x1F6DF);
addUnicodeToSet(emojiSignatureSet, 0x1F6E0, 0x1F6EC);
// addUnicodeToSet(emojiSignatureSet, 0x1F6ED, 0x1F6EF);
addUnicodeToSet(emojiSignatureSet, 0x1F6F0, 0x1F6F3);
addUnicodeToSet(emojiSignatureSet, 0x1F6F4, 0x1F6F6);
addUnicodeToSet(emojiSignatureSet, 0x1F6F7, 0x1F6F8);
addUnicodeToSet(emojiSignatureSet, 0x1F6F9);
// addUnicodeToSet(emojiSignatureSet, 0x1F6FA, 0x1F6FF);
// addUnicodeToSet(emojiSignatureSet, 0x1F774, 0x1F77F);
addUnicodeToSet(emojiSignatureSet, 0x1F7D5, 0x1F7D8);
// addUnicodeToSet(emojiSignatureSet, 0x1F7D9, 0x1F7FF);
// addUnicodeToSet(emojiSignatureSet, 0x1F80C, 0x1F80F);
// addUnicodeToSet(emojiSignatureSet, 0x1F848, 0x1F84F);
// addUnicodeToSet(emojiSignatureSet, 0x1F85A, 0x1F85F);
// addUnicodeToSet(emojiSignatureSet, 0x1F888, 0x1F88F);
// addUnicodeToSet(emojiSignatureSet, 0x1F8AE, 0x1F8FF);
// addUnicodeToSet(emojiSignatureSet, 0x1F90C, 0x1F90F);
addUnicodeToSet(emojiSignatureSet, 0x1F910, 0x1F918);
addUnicodeToSet(emojiSignatureSet, 0x1F919, 0x1F91E);
addUnicodeToSet(emojiSignatureSet, 0x1F91F);
addUnicodeToSet(emojiSignatureSet, 0x1F920, 0x1F927);
addUnicodeToSet(emojiSignatureSet, 0x1F928, 0x1F92F);
addUnicodeToSet(emojiSignatureSet, 0x1F930);
addUnicodeToSet(emojiSignatureSet, 0x1F931, 0x1F932);
addUnicodeToSet(emojiSignatureSet, 0x1F933, 0x1F93A);
addUnicodeToSet(emojiSignatureSet, 0x1F93C, 0x1F93E);
// addUnicodeToSet(emojiSignatureSet, 0x1F93F);
addUnicodeToSet(emojiSignatureSet, 0x1F940, 0x1F945);
addUnicodeToSet(emojiSignatureSet, 0x1F947, 0x1F94B);
addUnicodeToSet(emojiSignatureSet, 0x1F94C);
addUnicodeToSet(emojiSignatureSet, 0x1F94D, 0x1F94F);
addUnicodeToSet(emojiSignatureSet, 0x1F950, 0x1F95E);
addUnicodeToSet(emojiSignatureSet, 0x1F95F, 0x1F96B);
addUnicodeToSet(emojiSignatureSet, 0x1F96C, 0x1F970);
// addUnicodeToSet(emojiSignatureSet, 0x1F971, 0x1F972);
addUnicodeToSet(emojiSignatureSet, 0x1F973, 0x1F976);
// addUnicodeToSet(emojiSignatureSet, 0x1F977, 0x1F979);
addUnicodeToSet(emojiSignatureSet, 0x1F97A);
// addUnicodeToSet(emojiSignatureSet, 0x1F97B);
addUnicodeToSet(emojiSignatureSet, 0x1F97C, 0x1F97F);
addUnicodeToSet(emojiSignatureSet, 0x1F980, 0x1F984);
addUnicodeToSet(emojiSignatureSet, 0x1F985, 0x1F991);
addUnicodeToSet(emojiSignatureSet, 0x1F992, 0x1F997);
addUnicodeToSet(emojiSignatureSet, 0x1F998, 0x1F9A2);
// addUnicodeToSet(emojiSignatureSet, 0x1F9A3, 0x1F9AF);
addUnicodeToSet(emojiSignatureSet, 0x1F9B0, 0x1F9B9);
// addUnicodeToSet(emojiSignatureSet, 0x1F9BA, 0x1F9BF);
addUnicodeToSet(emojiSignatureSet, 0x1F9C0);
addUnicodeToSet(emojiSignatureSet, 0x1F9C1, 0x1F9C2);
// addUnicodeToSet(emojiSignatureSet, 0x1F9C3, 0x1F9CF);
addUnicodeToSet(emojiSignatureSet, 0x1F9D0, 0x1F9E6);
addUnicodeToSet(emojiSignatureSet, 0x1F9E7, 0x1F9FF);
// addUnicodeToSet(emojiSignatureSet, 0x1FA00, 0x1FA5F);
addUnicodeToSet(emojiSignatureSet, 0x1FA60, 0x1FA6D);
// addUnicodeToSet(emojiSignatureSet, 0x1FA6E, 0x1FFFD);
Log.d(TAG, "initSignatureSet end: " + emojiSignatureSet.size());
}
}