* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
[not found] ` <20200229173125.E2D3A21167@vcs0.savannah.gnu.org>
@ 2020-03-02 10:40 ` Robert Pluim
2020-03-02 11:36 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-02 10:40 UTC (permalink / raw)
To: emacs-devel; +Cc: Eli Zaretskii
>>>>> On Sat, 29 Feb 2020 12:31:25 -0500 (EST), eliz@gnu.org (Eli Zaretskii) said:
Eli> Emacs by default displays the Variation Selector (VS) codepoints not
Eli> -composed with base characters as thin 1-pixel space glyphs. The
Eli> -Unicode FAQ says that if variation sequences cannot be supported, the
Eli> -VS characters should not be shown, leaving just the base character of
Eli> -the sequence visible. This could be handled via
Eli> -glyphless-char-display, by changing the entries for VS codepoints to
Eli> -'zero-width'.
Eli> +composed with base characters as hex codes in a box. The Unicode FAQ
Eli> +says that if variation sequences cannot be supported, the VS
Eli> +characters should not be shown, leaving just the base character of the
Eli> +sequence visible. This could be handled via glyphless-char-display,
Eli> +by changing the entries for VS codepoints to 'zero-width'. Or we
Eli> +could display them as a thin 1-pixel space, as we do with format
Eli> +control characters, by using 'thin-space' there.
I have emacs set up to show a 1-pixel space, since I hate hidden
control characters. I think it would be a better default than a
hex-box or hiding them.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 10:40 ` emacs-27 60c84ad: ; * etc/TODO: Fix last change Robert Pluim
@ 2020-03-02 11:36 ` Eli Zaretskii
2020-03-02 14:08 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-02 11:36 UTC (permalink / raw)
To: Robert Pluim; +Cc: emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Date: Mon, 02 Mar 2020 11:40:35 +0100
> Cc: Eli Zaretskii <eliz@gnu.org>
>
> >>>>> On Sat, 29 Feb 2020 12:31:25 -0500 (EST), eliz@gnu.org (Eli Zaretskii) said:
>
> Eli> Emacs by default displays the Variation Selector (VS) codepoints not
> Eli> -composed with base characters as thin 1-pixel space glyphs. The
> Eli> -Unicode FAQ says that if variation sequences cannot be supported, the
> Eli> -VS characters should not be shown, leaving just the base character of
> Eli> -the sequence visible. This could be handled via
> Eli> -glyphless-char-display, by changing the entries for VS codepoints to
> Eli> -'zero-width'.
> Eli> +composed with base characters as hex codes in a box. The Unicode FAQ
> Eli> +says that if variation sequences cannot be supported, the VS
> Eli> +characters should not be shown, leaving just the base character of the
> Eli> +sequence visible. This could be handled via glyphless-char-display,
> Eli> +by changing the entries for VS codepoints to 'zero-width'. Or we
> Eli> +could display them as a thin 1-pixel space, as we do with format
> Eli> +control characters, by using 'thin-space' there.
>
> I have emacs set up to show a 1-pixel space, since I hate hidden
> control characters. I think it would be a better default than a
> hex-box or hiding them.
Then maybe this TODO item is for you ;-)
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 11:36 ` Eli Zaretskii
@ 2020-03-02 14:08 ` Robert Pluim
2020-03-02 14:24 ` Eli Zaretskii
2020-03-02 16:58 ` Stefan Monnier
0 siblings, 2 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-02 14:08 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: emacs-devel
>>>>> On Mon, 02 Mar 2020 13:36:26 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Date: Mon, 02 Mar 2020 11:40:35 +0100
>> Cc: Eli Zaretskii <eliz@gnu.org>
>>
>> >>>>> On Sat, 29 Feb 2020 12:31:25 -0500 (EST), eliz@gnu.org (Eli Zaretskii) said:
>>
Eli> Emacs by default displays the Variation Selector (VS) codepoints not
Eli> -composed with base characters as thin 1-pixel space glyphs. The
Eli> -Unicode FAQ says that if variation sequences cannot be supported, the
Eli> -VS characters should not be shown, leaving just the base character of
Eli> -the sequence visible. This could be handled via
Eli> -glyphless-char-display, by changing the entries for VS codepoints to
Eli> -'zero-width'.
Eli> +composed with base characters as hex codes in a box. The Unicode FAQ
Eli> +says that if variation sequences cannot be supported, the VS
Eli> +characters should not be shown, leaving just the base character of the
Eli> +sequence visible. This could be handled via glyphless-char-display,
Eli> +by changing the entries for VS codepoints to 'zero-width'. Or we
Eli> +could display them as a thin 1-pixel space, as we do with format
Eli> +control characters, by using 'thin-space' there.
>>
>> I have emacs set up to show a 1-pixel space, since I hate hidden
>> control characters. I think it would be a better default than a
>> hex-box or hiding them.
Eli> Then maybe this TODO item is for you ;-)
I thought processing the emoji files from Unicode was mine? :-) Iʼll
take a look after that is done.
BTW, Iʼve run into a small problem with that: Iʼm using regexp-opt,
which results in:
Loading international/emoji-zwj...
Attempt to autoload regexp-opt while preparing to dump
make[1]: *** [emacs.pdmp] Error 255
I canʼt require it either:
Loading international/emoji-zwj...
(require regexp-opt) while preparing to dump
make[1]: *** [emacs.pdmp] Error 255
I guess the composition rules donʼt *have* to be dumped, but it would
be nice if they were.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 14:08 ` Robert Pluim
@ 2020-03-02 14:24 ` Eli Zaretskii
2020-03-02 14:36 ` Eli Zaretskii
2020-03-02 16:58 ` Stefan Monnier
1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-02 14:24 UTC (permalink / raw)
To: Robert Pluim; +Cc: emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Date: Mon, 02 Mar 2020 15:08:47 +0100
> Cc: emacs-devel@gnu.org
>
> BTW, Iʼve run into a small problem with that: Iʼm using regexp-opt,
> which results in:
>
> Loading international/emoji-zwj...
> Attempt to autoload regexp-opt while preparing to dump
> make[1]: *** [emacs.pdmp] Error 255
>
> I canʼt require it either:
>
> Loading international/emoji-zwj...
> (require regexp-opt) while preparing to dump
> make[1]: *** [emacs.pdmp] Error 255
>
> I guess the composition rules donʼt *have* to be dumped, but it would
> be nice if they were.
You could run regexp-opt in a separate emacs invocation, then write
the results to a file, and load that, I guess.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 14:24 ` Eli Zaretskii
@ 2020-03-02 14:36 ` Eli Zaretskii
2020-03-02 15:06 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-02 14:36 UTC (permalink / raw)
To: rpluim; +Cc: emacs-devel
> Date: Mon, 02 Mar 2020 16:24:30 +0200
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: emacs-devel@gnu.org
>
> You could run regexp-opt in a separate emacs invocation, then write
> the results to a file, and load that, I guess.
On second thought: why do you need regexp-opt in this case? None of
the other composition rules we have (search lisp/language/*.el for
composition-function-table) use that, so why is Emoji different?
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 14:36 ` Eli Zaretskii
@ 2020-03-02 15:06 ` Robert Pluim
2020-03-02 15:25 ` Eli Zaretskii
2020-03-02 15:34 ` Eli Zaretskii
0 siblings, 2 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-02 15:06 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: emacs-devel
>>>>> On Mon, 02 Mar 2020 16:36:11 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> Date: Mon, 02 Mar 2020 16:24:30 +0200
>> From: Eli Zaretskii <eliz@gnu.org>
>> Cc: emacs-devel@gnu.org
>>
>> You could run regexp-opt in a separate emacs invocation, then write
>> the results to a file, and load that, I guess.
Eli> On second thought: why do you need regexp-opt in this case? None of
Eli> the other composition rules we have (search lisp/language/*.el for
Eli> composition-function-table) use that, so why is Emoji different?
The ones in lisp/language/*.el were presumably written by hand, unlike
the Emoji ones.
Hereʼs an example of the patterns we want to match for U+1F3C3 (there
are longer ones):
"\N{U+1F3C3}\N{U+200D}\N{U+2640}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+200D}\N{U+2642}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FB}\N{U+200D}\N{U+2640}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FB}\N{U+200D}\N{U+2642}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FC}\N{U+200D}\N{U+2640}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FC}\N{U+200D}\N{U+2642}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FD}\N{U+200D}\N{U+2640}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FD}\N{U+200D}\N{U+2642}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FE}\N{U+200D}\N{U+2640}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FE}\N{U+200D}\N{U+2642}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FF}\N{U+200D}\N{U+2640}\N{U+FE0F}"
"\N{U+1F3C3}\N{U+1F3FF}\N{U+200D}\N{U+2642}\N{U+FE0F}"
Now we could add 12 rules here, one for each pattern, or 1 rule with
all the patterns as alternatives, or we could run regexp-opt and add
one optimized pattern.
Or we could take a leaf out of FE0F's book, and just do:
"\N{U+1F3C3}...?\N{U+FE0F}"
but I thought that since this runs inside redisplay, we should strive
to make the patterns as specific as possible.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 15:06 ` Robert Pluim
@ 2020-03-02 15:25 ` Eli Zaretskii
2020-03-02 15:42 ` Robert Pluim
2020-03-02 15:34 ` Eli Zaretskii
1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-02 15:25 UTC (permalink / raw)
To: Robert Pluim; +Cc: emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: emacs-devel@gnu.org
> Date: Mon, 02 Mar 2020 16:06:17 +0100
>
> Eli> On second thought: why do you need regexp-opt in this case? None of
> Eli> the other composition rules we have (search lisp/language/*.el for
> Eli> composition-function-table) use that, so why is Emoji different?
>
> The ones in lisp/language/*.el were presumably written by hand, unlike
> the Emoji ones.
>
> Hereʼs an example of the patterns we want to match for U+1F3C3 (there
> are longer ones):
>
> "\N{U+1F3C3}\N{U+200D}\N{U+2640}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+200D}\N{U+2642}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FB}\N{U+200D}\N{U+2640}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FB}\N{U+200D}\N{U+2642}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FC}\N{U+200D}\N{U+2640}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FC}\N{U+200D}\N{U+2642}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FD}\N{U+200D}\N{U+2640}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FD}\N{U+200D}\N{U+2642}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FE}\N{U+200D}\N{U+2640}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FE}\N{U+200D}\N{U+2642}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FF}\N{U+200D}\N{U+2640}\N{U+FE0F}"
> "\N{U+1F3C3}\N{U+1F3FF}\N{U+200D}\N{U+2642}\N{U+FE0F}"
>
> Now we could add 12 rules here, one for each pattern, or 1 rule with
> all the patterns as alternatives, or we could run regexp-opt and add
> one optimized pattern.
If this is easier done by hand, maybe we should just do that. We
could instead have an automated way of _checking_ the patterns against
emoji-*.txt files and flagging the new ones to add. After all,
Unicode files don't change too frequently, and we already use similar
practices with other Unicode data files we import, see
admin/notes/unicode.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 15:06 ` Robert Pluim
2020-03-02 15:25 ` Eli Zaretskii
@ 2020-03-02 15:34 ` Eli Zaretskii
1 sibling, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-02 15:34 UTC (permalink / raw)
To: Robert Pluim; +Cc: emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: emacs-devel@gnu.org
> Date: Mon, 02 Mar 2020 16:06:17 +0100
>
> Or we could take a leaf out of FE0F's book, and just do:
>
> "\N{U+1F3C3}...?\N{U+FE0F}"
>
> but I thought that since this runs inside redisplay, we should strive
> to make the patterns as specific as possible.
Not sure if it's better to have several rules rather than one which
used regexp conditionals. The code in composite.c iterates through
the rules one by one, each time calling the regex search, whereas a
single regexp will be compiled once, then matched, and regex-emacs.c
is quite optimized. So it might be best to have something like (for
the sequences you show)
\U001f3c3[\U001f3fb-\U001f3ff]?\u200d[\u2640\u2642]\ufe0f
We use such regexps a lot in composition rules elsewhere.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 15:25 ` Eli Zaretskii
@ 2020-03-02 15:42 ` Robert Pluim
2020-03-02 15:58 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-02 15:42 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: emacs-devel
>>>>> On Mon, 02 Mar 2020 17:25:26 +0200, Eli Zaretskii <eliz@gnu.org> said:
Eli> If this is easier done by hand, maybe we should just do that. We
Eli> could instead have an automated way of _checking_ the patterns against
Eli> emoji-*.txt files and flagging the new ones to add. After all,
Eli> Unicode files don't change too frequently, and we already use similar
Eli> practices with other Unicode data files we import, see
Eli> admin/notes/unicode.
U+1F468 has 165 patterns. I donʼt want to do that one by hand. Iʼll
figure out some way to get regexp-opt working.
Checking the patterns when a new file is produced should be as simple
as 'diff'.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 15:42 ` Robert Pluim
@ 2020-03-02 15:58 ` Eli Zaretskii
2020-03-02 16:40 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-02 15:58 UTC (permalink / raw)
To: Robert Pluim; +Cc: emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Date: Mon, 02 Mar 2020 16:42:02 +0100
> Cc: emacs-devel@gnu.org
>
> U+1F468 has 165 patterns. I donʼt want to do that one by hand. Iʼll
> figure out some way to get regexp-opt working.
It's up to you, of course. I just want to point out that the patterns
for U+1F468 are very ordered, and only the last part is a large list
(as opposed to a contiguous range or a small set) of codepoints.
Converting them to a regexp by hand is not such a hard job. Just a
thought.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 15:58 ` Eli Zaretskii
@ 2020-03-02 16:40 ` Robert Pluim
0 siblings, 0 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-02 16:40 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: emacs-devel
>>>>> On Mon, 02 Mar 2020 17:58:50 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Date: Mon, 02 Mar 2020 16:42:02 +0100
>> Cc: emacs-devel@gnu.org
>>
>> U+1F468 has 165 patterns. I donʼt want to do that one by hand. Iʼll
>> figure out some way to get regexp-opt working.
Eli> It's up to you, of course. I just want to point out that the patterns
Eli> for U+1F468 are very ordered, and only the last part is a large list
Eli> (as opposed to a contiguous range or a small set) of codepoints.
Eli> Converting them to a regexp by hand is not such a hard job. Just a
Eli> thought.
Yes, not hard, just tedious and not-fun :-)
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 14:08 ` Robert Pluim
2020-03-02 14:24 ` Eli Zaretskii
@ 2020-03-02 16:58 ` Stefan Monnier
2020-03-02 20:12 ` Robert Pluim
1 sibling, 1 reply; 45+ messages in thread
From: Stefan Monnier @ 2020-03-02 16:58 UTC (permalink / raw)
To: Robert Pluim; +Cc: Eli Zaretskii, emacs-devel
> BTW, Iʼve run into a small problem with that: Iʼm using regexp-opt,
> which results in:
>
> Loading international/emoji-zwj...
> Attempt to autoload regexp-opt while preparing to dump
> make[1]: *** [emacs.pdmp] Error 255
>
> I canʼt require it either:
>
> Loading international/emoji-zwj...
> (require regexp-opt) while preparing to dump
> make[1]: *** [emacs.pdmp] Error 255
Try and make sure that regexp-opt is only used during compilation,
e.g. by wrapping it inside an `eval-when-compile`.
Stefan
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 16:58 ` Stefan Monnier
@ 2020-03-02 20:12 ` Robert Pluim
2020-03-02 20:21 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-02 20:12 UTC (permalink / raw)
To: Stefan Monnier; +Cc: Eli Zaretskii, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 765 bytes --]
>>>>> On Mon, 02 Mar 2020 11:58:39 -0500, Stefan Monnier <monnier@iro.umontreal.ca> said:
>> BTW, Iʼve run into a small problem with that: Iʼm using regexp-opt,
>> which results in:
>>
>> Loading international/emoji-zwj...
>> Attempt to autoload regexp-opt while preparing to dump
>> make[1]: *** [emacs.pdmp] Error 255
>>
>> I canʼt require it either:
>>
>> Loading international/emoji-zwj...
>> (require regexp-opt) while preparing to dump
>> make[1]: *** [emacs.pdmp] Error 255
Stefan> Try and make sure that regexp-opt is only used during compilation,
Stefan> e.g. by wrapping it inside an `eval-when-compile`.
Thanks for that, itʼs working now.
Latest version attached.
[-- Attachment #2: 0001-Emoji-zwj-wip.patch --]
[-- Type: text/x-patch, Size: 159927 bytes --]
From d74a4522faa66d65622303b8aa8dd99601930de8 Mon Sep 17 00:00:00 2001
From: Robert Pluim <rpluim@gmail.com>
Date: Mon, 2 Mar 2020 17:48:21 +0100
Subject: [PATCH] Emoji-zwj wip
To: emacs-devel@gnu.org
---
.gitignore | 1 +
admin/unidata/Makefile.in | 10 +-
admin/unidata/README | 4 +
admin/unidata/emoji-zwj-sequences.txt | 961 ++++++++++++++++++++++++++
admin/unidata/emoji-zwj.awk | 102 +++
etc/NEWS | 6 +
lisp/international/characters.el | 8 +-
src/Makefile.in | 8 +-
8 files changed, 1095 insertions(+), 5 deletions(-)
create mode 100644 admin/unidata/emoji-zwj-sequences.txt
create mode 100644 admin/unidata/emoji-zwj.awk
diff --git a/.gitignore b/.gitignore
index d4be6bb23e..a5fffe7c9d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -200,6 +200,7 @@ etc/charsets/*.map
lisp/international/charprop.el
lisp/international/charscript.el
lisp/international/cp51932.el
+lisp/international/emoji-zwj.el
lisp/international/eucjp-ms.el
lisp/international/uni-*.el
lisp/language/pinyin.el
diff --git a/admin/unidata/Makefile.in b/admin/unidata/Makefile.in
index f3e1c78611..b9051645f9 100644
--- a/admin/unidata/Makefile.in
+++ b/admin/unidata/Makefile.in
@@ -57,7 +57,7 @@ am__v_at_1 =
.PHONY: all
all: ${top_srcdir}/src/macuvs.h ${unifiles} ${unidir}/charscript.el \
- ${unidir}/charprop.el
+ ${unidir}/charprop.el ${unidir}/emoji-zwj.el
## Specify .elc as an order-only prereq so as to not needlessly rebuild
## target just because the .elc is missing.
@@ -100,6 +100,13 @@ blocks =
${unidir}/charscript.el: ${srcdir}/Blocks.txt ${blocks}
$(AM_V_GEN)$(AWK) -f ${blocks} < $< > $@
+.PHONY: emoji-zwj.el
+emoji-zwj.el: ${unidir}/emoji-zwj.el
+
+zwj = ${srcdir}/emoji-zwj.awk
+
+${unidir}/emoji-zwj.el: ${srcdir}/emoji-zwj-sequences.txt ${zwj}
+ $(AM_V_GEN)$(AWK) -f ${zwj} < $< > $@
.PHONY: clean bootstrap-clean distclean maintainer-clean extraclean
@@ -123,4 +130,5 @@ maintainer-clean:
## from a make target, we don't delete it here.
extraclean: distclean
rm -f ${unidir}/charscript.el*
+ rm -f ${unidir}/emoji-zwj.el*
rm -f ${unifiles} ${unidir}/charprop.el
diff --git a/admin/unidata/README b/admin/unidata/README
index f5881a1a14..d15e2835c8 100644
--- a/admin/unidata/README
+++ b/admin/unidata/README
@@ -32,3 +32,7 @@ http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt
SpecialCasing.txt
http://unicode.org/Public/UNIDATA/SpecialCasing.txt
2017-04-20
+
+emoji-zwj-sequences.txt
+https://www.unicode.org/Public/emoji/12.0/emoji-zwj-sequences.txt
+2020-02-28
diff --git a/admin/unidata/emoji-zwj-sequences.txt b/admin/unidata/emoji-zwj-sequences.txt
new file mode 100644
index 0000000000..3dff84a0a8
--- /dev/null
+++ b/admin/unidata/emoji-zwj-sequences.txt
@@ -0,0 +1,961 @@
+# emoji-zwj-sequences.txt
+# Date: 2019-01-15, 19:25:59 GMT
+# © 2019 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Emoji ZWJ Sequences for UTS #51
+# Version: 12.0
+#
+# For documentation and usage, see http://www.unicode.org/reports/tr51
+#
+# Format:
+# code_point(s) ; type_field ; description # comments
+# Fields:
+# code_point(s): one or more code points in hex format, separated by spaces
+# type_field :Emoji_ZWJ_Sequence
+# The type_field is a convenience for parsing the emoji sequence files, and is not intended to be maintained as a property.
+# short name: CLDR short name of sequence; characters may be escaped with \x{hex}.
+#
+# Characters and sequences are listed in code point order. Users should be shown a more natural order.
+# See the CLDR collation order for Emoji.
+
+# ================================================
+
+# Emoji_ZWJ_Sequence: Family
+
+1F468 200D 2764 FE0F 200D 1F468 ; Emoji_ZWJ_Sequence ; couple with heart: man, man # 6.0 [1] (👨❤️👨)
+1F468 200D 2764 FE0F 200D 1F48B 200D 1F468 ; Emoji_ZWJ_Sequence ; kiss: man, man # 6.0 [1] (👨❤️💋👨)
+1F468 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, boy # 6.0 [1] (👨👦)
+1F468 200D 1F466 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, boy, boy # 6.0 [1] (👨👦👦)
+1F468 200D 1F467 ; Emoji_ZWJ_Sequence ; family: man, girl # 6.0 [1] (👨👧)
+1F468 200D 1F467 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, girl, boy # 6.0 [1] (👨👧👦)
+1F468 200D 1F467 200D 1F467 ; Emoji_ZWJ_Sequence ; family: man, girl, girl # 6.0 [1] (👨👧👧)
+1F468 200D 1F468 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, man, boy # 6.0 [1] (👨👨👦)
+1F468 200D 1F468 200D 1F466 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, man, boy, boy # 6.0 [1] (👨👨👦👦)
+1F468 200D 1F468 200D 1F467 ; Emoji_ZWJ_Sequence ; family: man, man, girl # 6.0 [1] (👨👨👧)
+1F468 200D 1F468 200D 1F467 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, man, girl, boy # 6.0 [1] (👨👨👧👦)
+1F468 200D 1F468 200D 1F467 200D 1F467 ; Emoji_ZWJ_Sequence ; family: man, man, girl, girl # 6.0 [1] (👨👨👧👧)
+1F468 200D 1F469 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, woman, boy # 6.0 [1] (👨👩👦)
+1F468 200D 1F469 200D 1F466 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, woman, boy, boy # 6.0 [1] (👨👩👦👦)
+1F468 200D 1F469 200D 1F467 ; Emoji_ZWJ_Sequence ; family: man, woman, girl # 6.0 [1] (👨👩👧)
+1F468 200D 1F469 200D 1F467 200D 1F466 ; Emoji_ZWJ_Sequence ; family: man, woman, girl, boy # 6.0 [1] (👨👩👧👦)
+1F468 200D 1F469 200D 1F467 200D 1F467 ; Emoji_ZWJ_Sequence ; family: man, woman, girl, girl # 6.0 [1] (👨👩👧👧)
+1F468 1F3FC 200D 1F91D 200D 1F468 1F3FB ; Emoji_ZWJ_Sequence ; men holding hands: medium-light skin tone, light skin tone # 9.0 [1] (👨🏼🤝👨🏻)
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FB ; Emoji_ZWJ_Sequence ; men holding hands: medium skin tone, light skin tone # 9.0 [1] (👨🏽🤝👨🏻)
+1F468 1F3FD 200D 1F91D 200D 1F468 1F3FC ; Emoji_ZWJ_Sequence ; men holding hands: medium skin tone, medium-light skin tone # 9.0 [1] (👨🏽🤝👨🏼)
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FB ; Emoji_ZWJ_Sequence ; men holding hands: medium-dark skin tone, light skin tone # 9.0 [1] (👨🏾🤝👨🏻)
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FC ; Emoji_ZWJ_Sequence ; men holding hands: medium-dark skin tone, medium-light skin tone #9.0 [1] (👨🏾🤝👨🏼)
+1F468 1F3FE 200D 1F91D 200D 1F468 1F3FD ; Emoji_ZWJ_Sequence ; men holding hands: medium-dark skin tone, medium skin tone # 9.0 [1] (👨🏾🤝👨🏽)
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FB ; Emoji_ZWJ_Sequence ; men holding hands: dark skin tone, light skin tone # 9.0 [1] (👨🏿🤝👨🏻)
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FC ; Emoji_ZWJ_Sequence ; men holding hands: dark skin tone, medium-light skin tone # 9.0 [1] (👨🏿🤝👨🏼)
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FD ; Emoji_ZWJ_Sequence ; men holding hands: dark skin tone, medium skin tone # 9.0 [1] (👨🏿🤝👨🏽)
+1F468 1F3FF 200D 1F91D 200D 1F468 1F3FE ; Emoji_ZWJ_Sequence ; men holding hands: dark skin tone, medium-dark skin tone # 9.0 [1] (👨🏿🤝👨🏾)
+1F469 200D 2764 FE0F 200D 1F468 ; Emoji_ZWJ_Sequence ; couple with heart: woman, man # 6.0 [1] (👩❤️👨)
+1F469 200D 2764 FE0F 200D 1F469 ; Emoji_ZWJ_Sequence ; couple with heart: woman, woman # 6.0 [1] (👩❤️👩)
+1F469 200D 2764 FE0F 200D 1F48B 200D 1F468 ; Emoji_ZWJ_Sequence ; kiss: woman, man # 6.0 [1] (👩❤️💋👨)
+1F469 200D 2764 FE0F 200D 1F48B 200D 1F469 ; Emoji_ZWJ_Sequence ; kiss: woman, woman # 6.0 [1] (👩❤️💋👩)
+1F469 200D 1F466 ; Emoji_ZWJ_Sequence ; family: woman, boy # 6.0 [1] (👩👦)
+1F469 200D 1F466 200D 1F466 ; Emoji_ZWJ_Sequence ; family: woman, boy, boy # 6.0 [1] (👩👦👦)
+1F469 200D 1F467 ; Emoji_ZWJ_Sequence ; family: woman, girl # 6.0 [1] (👩👧)
+1F469 200D 1F467 200D 1F466 ; Emoji_ZWJ_Sequence ; family: woman, girl, boy # 6.0 [1] (👩👧👦)
+1F469 200D 1F467 200D 1F467 ; Emoji_ZWJ_Sequence ; family: woman, girl, girl # 6.0 [1] (👩👧👧)
+1F469 200D 1F469 200D 1F466 ; Emoji_ZWJ_Sequence ; family: woman, woman, boy # 6.0 [1] (👩👩👦)
+1F469 200D 1F469 200D 1F466 200D 1F466 ; Emoji_ZWJ_Sequence ; family: woman, woman, boy, boy # 6.0 [1] (👩👩👦👦)
+1F469 200D 1F469 200D 1F467 ; Emoji_ZWJ_Sequence ; family: woman, woman, girl # 6.0 [1] (👩👩👧)
+1F469 200D 1F469 200D 1F467 200D 1F466 ; Emoji_ZWJ_Sequence ; family: woman, woman, girl, boy # 6.0 [1] (👩👩👧👦)
+1F469 200D 1F469 200D 1F467 200D 1F467 ; Emoji_ZWJ_Sequence ; family: woman, woman, girl, girl # 6.0 [1] (👩👩👧👧)
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FC ; Emoji_ZWJ_Sequence ; woman and man holding hands: light skin tone, medium-light skin tone #9.0[1] (👩🏻🤝👨🏼)
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FD ; Emoji_ZWJ_Sequence ; woman and man holding hands: light skin tone, medium skin tone # 9.0 [1] (👩🏻🤝👨🏽)
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FE ; Emoji_ZWJ_Sequence ; woman and man holding hands: light skin tone, medium-dark skin tone #9.0[1] (👩🏻🤝👨🏾)
+1F469 1F3FB 200D 1F91D 200D 1F468 1F3FF ; Emoji_ZWJ_Sequence ; woman and man holding hands: light skin tone, dark skin tone # 9.0 [1] (👩🏻🤝👨🏿)
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FB ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium-light skin tone, light skin tone #9.0[1] (👩🏼🤝👨🏻)
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FD ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium-light skin tone, medium skin tone #9.0[1] (👩🏼🤝👨🏽)
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FE ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium-light skin tone, medium-dark skin tone #9.0[1] (👩🏼🤝👨🏾)
+1F469 1F3FC 200D 1F91D 200D 1F468 1F3FF ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium-light skin tone, dark skin tone #9.0[1] (👩🏼🤝👨🏿)
+1F469 1F3FC 200D 1F91D 200D 1F469 1F3FB ; Emoji_ZWJ_Sequence ; women holding hands: medium-light skin tone, light skin tone # 9.0 [1] (👩🏼🤝👩🏻)
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FB ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium skin tone, light skin tone # 9.0 [1] (👩🏽🤝👨🏻)
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FC ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium skin tone, medium-light skin tone #9.0[1] (👩🏽🤝👨🏼)
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FE ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium skin tone, medium-dark skin tone #9.0[1] (👩🏽🤝👨🏾)
+1F469 1F3FD 200D 1F91D 200D 1F468 1F3FF ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium skin tone, dark skin tone # 9.0 [1] (👩🏽🤝👨🏿)
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FB ; Emoji_ZWJ_Sequence ; women holding hands: medium skin tone, light skin tone # 9.0 [1] (👩🏽🤝👩🏻)
+1F469 1F3FD 200D 1F91D 200D 1F469 1F3FC ; Emoji_ZWJ_Sequence ; women holding hands: medium skin tone, medium-light skin tone # 9.0 [1] (👩🏽🤝👩🏼)
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FB ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium-dark skin tone, light skin tone #9.0[1] (👩🏾🤝👨🏻)
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FC ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium-dark skin tone, medium-light skin tone #9.0[1] (👩🏾🤝👨🏼)
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FD ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium-dark skin tone, medium skin tone #9.0[1] (👩🏾🤝👨🏽)
+1F469 1F3FE 200D 1F91D 200D 1F468 1F3FF ; Emoji_ZWJ_Sequence ; woman and man holding hands: medium-dark skin tone, dark skin tone #9.0[1] (👩🏾🤝👨🏿)
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FB ; Emoji_ZWJ_Sequence ; women holding hands: medium-dark skin tone, light skin tone # 9.0 [1] (👩🏾🤝👩🏻)
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FC ; Emoji_ZWJ_Sequence ; women holding hands: medium-dark skin tone, medium-light skin tone #9.0[1] (👩🏾🤝👩🏼)
+1F469 1F3FE 200D 1F91D 200D 1F469 1F3FD ; Emoji_ZWJ_Sequence ; women holding hands: medium-dark skin tone, medium skin tone # 9.0 [1] (👩🏾🤝👩🏽)
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FB ; Emoji_ZWJ_Sequence ; woman and man holding hands: dark skin tone, light skin tone # 9.0 [1] (👩🏿🤝👨🏻)
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FC ; Emoji_ZWJ_Sequence ; woman and man holding hands: dark skin tone, medium-light skin tone #9.0[1] (👩🏿🤝👨🏼)
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FD ; Emoji_ZWJ_Sequence ; woman and man holding hands: dark skin tone, medium skin tone # 9.0 [1] (👩🏿🤝👨🏽)
+1F469 1F3FF 200D 1F91D 200D 1F468 1F3FE ; Emoji_ZWJ_Sequence ; woman and man holding hands: dark skin tone, medium-dark skin tone #9.0[1] (👩🏿🤝👨🏾)
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FB ; Emoji_ZWJ_Sequence ; women holding hands: dark skin tone, light skin tone # 9.0 [1] (👩🏿🤝👩🏻)
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FC ; Emoji_ZWJ_Sequence ; women holding hands: dark skin tone, medium-light skin tone # 9.0 [1] (👩🏿🤝👩🏼)
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FD ; Emoji_ZWJ_Sequence ; women holding hands: dark skin tone, medium skin tone # 9.0 [1] (👩🏿🤝👩🏽)
+1F469 1F3FF 200D 1F91D 200D 1F469 1F3FE ; Emoji_ZWJ_Sequence ; women holding hands: dark skin tone, medium-dark skin tone # 9.0 [1] (👩🏿🤝👩🏾)
+1F9D1 200D 1F91D 200D 1F9D1 ; Emoji_ZWJ_Sequence ; people holding hands # 10.0 [1] (🧑🤝🧑)
+1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FB ; Emoji_ZWJ_Sequence ; people holding hands: light skin tone # 10.0 [1] (🧑🏻🤝🧑🏻)
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FB ; Emoji_ZWJ_Sequence ; people holding hands: medium-light skin tone, light skin tone # 10.0 [1] (🧑🏼🤝🧑🏻)
+1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FC ; Emoji_ZWJ_Sequence ; people holding hands: medium-light skin tone # 10.0 [1] (🧑🏼🤝🧑🏼)
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FB ; Emoji_ZWJ_Sequence ; people holding hands: medium skin tone, light skin tone # 10.0 [1] (🧑🏽🤝🧑🏻)
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FC ; Emoji_ZWJ_Sequence ; people holding hands: medium skin tone, medium-light skin tone # 10.0 [1] (🧑🏽🤝🧑🏼)
+1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FD ; Emoji_ZWJ_Sequence ; people holding hands: medium skin tone # 10.0 [1] (🧑🏽🤝🧑🏽)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FB ; Emoji_ZWJ_Sequence ; people holding hands: medium-dark skin tone, light skin tone # 10.0 [1] (🧑🏾🤝🧑🏻)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FC ; Emoji_ZWJ_Sequence ; people holding hands: medium-dark skin tone, medium-light skin tone #10.0[1] (🧑🏾🤝🧑🏼)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FD ; Emoji_ZWJ_Sequence ; people holding hands: medium-dark skin tone, medium skin tone # 10.0 [1] (🧑🏾🤝🧑🏽)
+1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FE ; Emoji_ZWJ_Sequence ; people holding hands: medium-dark skin tone # 10.0 [1] (🧑🏾🤝🧑🏾)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FB ; Emoji_ZWJ_Sequence ; people holding hands: dark skin tone, light skin tone # 10.0 [1] (🧑🏿🤝🧑🏻)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FC ; Emoji_ZWJ_Sequence ; people holding hands: dark skin tone, medium-light skin tone # 10.0 [1] (🧑🏿🤝🧑🏼)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FD ; Emoji_ZWJ_Sequence ; people holding hands: dark skin tone, medium skin tone # 10.0 [1] (🧑🏿🤝🧑🏽)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FE ; Emoji_ZWJ_Sequence ; people holding hands: dark skin tone, medium-dark skin tone # 10.0 [1] (🧑🏿🤝🧑🏾)
+1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FF ; Emoji_ZWJ_Sequence ; people holding hands: dark skin tone # 10.0 [1] (🧑🏿🤝🧑🏿)
+
+# Total elements: 87
+
+# ================================================
+
+# Emoji_ZWJ_Sequence: Role
+
+1F468 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; man health worker # 6.0 [1] (👨⚕️)
+1F468 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; man judge # 6.0 [1] (👨⚖️)
+1F468 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; man pilot # 6.0 [1] (👨✈️)
+1F468 200D 1F33E ; Emoji_ZWJ_Sequence ; man farmer # 6.0 [1] (👨🌾)
+1F468 200D 1F373 ; Emoji_ZWJ_Sequence ; man cook # 6.0 [1] (👨🍳)
+1F468 200D 1F393 ; Emoji_ZWJ_Sequence ; man student # 6.0 [1] (👨🎓)
+1F468 200D 1F3A4 ; Emoji_ZWJ_Sequence ; man singer # 6.0 [1] (👨🎤)
+1F468 200D 1F3A8 ; Emoji_ZWJ_Sequence ; man artist # 6.0 [1] (👨🎨)
+1F468 200D 1F3EB ; Emoji_ZWJ_Sequence ; man teacher # 6.0 [1] (👨🏫)
+1F468 200D 1F3ED ; Emoji_ZWJ_Sequence ; man factory worker # 6.0 [1] (👨🏭)
+1F468 200D 1F4BB ; Emoji_ZWJ_Sequence ; man technologist # 6.0 [1] (👨💻)
+1F468 200D 1F4BC ; Emoji_ZWJ_Sequence ; man office worker # 6.0 [1] (👨💼)
+1F468 200D 1F527 ; Emoji_ZWJ_Sequence ; man mechanic # 6.0 [1] (👨🔧)
+1F468 200D 1F52C ; Emoji_ZWJ_Sequence ; man scientist # 6.0 [1] (👨🔬)
+1F468 200D 1F680 ; Emoji_ZWJ_Sequence ; man astronaut # 6.0 [1] (👨🚀)
+1F468 200D 1F692 ; Emoji_ZWJ_Sequence ; man firefighter # 6.0 [1] (👨🚒)
+1F468 200D 1F9AF ; Emoji_ZWJ_Sequence ; man with probing cane # 12.0 [1] (👨🦯)
+1F468 200D 1F9BC ; Emoji_ZWJ_Sequence ; man in motorized wheelchair # 12.0 [1] (👨🦼)
+1F468 200D 1F9BD ; Emoji_ZWJ_Sequence ; man in manual wheelchair # 12.0 [1] (👨🦽)
+1F468 1F3FB 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; man health worker: light skin tone # 8.0 [1] (👨🏻⚕️)
+1F468 1F3FB 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; man judge: light skin tone # 8.0 [1] (👨🏻⚖️)
+1F468 1F3FB 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; man pilot: light skin tone # 8.0 [1] (👨🏻✈️)
+1F468 1F3FB 200D 1F33E ; Emoji_ZWJ_Sequence ; man farmer: light skin tone # 8.0 [1] (👨🏻🌾)
+1F468 1F3FB 200D 1F373 ; Emoji_ZWJ_Sequence ; man cook: light skin tone # 8.0 [1] (👨🏻🍳)
+1F468 1F3FB 200D 1F393 ; Emoji_ZWJ_Sequence ; man student: light skin tone # 8.0 [1] (👨🏻🎓)
+1F468 1F3FB 200D 1F3A4 ; Emoji_ZWJ_Sequence ; man singer: light skin tone # 8.0 [1] (👨🏻🎤)
+1F468 1F3FB 200D 1F3A8 ; Emoji_ZWJ_Sequence ; man artist: light skin tone # 8.0 [1] (👨🏻🎨)
+1F468 1F3FB 200D 1F3EB ; Emoji_ZWJ_Sequence ; man teacher: light skin tone # 8.0 [1] (👨🏻🏫)
+1F468 1F3FB 200D 1F3ED ; Emoji_ZWJ_Sequence ; man factory worker: light skin tone # 8.0 [1] (👨🏻🏭)
+1F468 1F3FB 200D 1F4BB ; Emoji_ZWJ_Sequence ; man technologist: light skin tone # 8.0 [1] (👨🏻💻)
+1F468 1F3FB 200D 1F4BC ; Emoji_ZWJ_Sequence ; man office worker: light skin tone # 8.0 [1] (👨🏻💼)
+1F468 1F3FB 200D 1F527 ; Emoji_ZWJ_Sequence ; man mechanic: light skin tone # 8.0 [1] (👨🏻🔧)
+1F468 1F3FB 200D 1F52C ; Emoji_ZWJ_Sequence ; man scientist: light skin tone # 8.0 [1] (👨🏻🔬)
+1F468 1F3FB 200D 1F680 ; Emoji_ZWJ_Sequence ; man astronaut: light skin tone # 8.0 [1] (👨🏻🚀)
+1F468 1F3FB 200D 1F692 ; Emoji_ZWJ_Sequence ; man firefighter: light skin tone # 8.0 [1] (👨🏻🚒)
+1F468 1F3FB 200D 1F9AF ; Emoji_ZWJ_Sequence ; man with probing cane: light skin tone # 12.0 [1] (👨🏻🦯)
+1F468 1F3FB 200D 1F9BC ; Emoji_ZWJ_Sequence ; man in motorized wheelchair: light skin tone # 12.0 [1] (👨🏻🦼)
+1F468 1F3FB 200D 1F9BD ; Emoji_ZWJ_Sequence ; man in manual wheelchair: light skin tone # 12.0 [1] (👨🏻🦽)
+1F468 1F3FC 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; man health worker: medium-light skin tone # 8.0 [1] (👨🏼⚕️)
+1F468 1F3FC 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; man judge: medium-light skin tone # 8.0 [1] (👨🏼⚖️)
+1F468 1F3FC 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; man pilot: medium-light skin tone # 8.0 [1] (👨🏼✈️)
+1F468 1F3FC 200D 1F33E ; Emoji_ZWJ_Sequence ; man farmer: medium-light skin tone # 8.0 [1] (👨🏼🌾)
+1F468 1F3FC 200D 1F373 ; Emoji_ZWJ_Sequence ; man cook: medium-light skin tone # 8.0 [1] (👨🏼🍳)
+1F468 1F3FC 200D 1F393 ; Emoji_ZWJ_Sequence ; man student: medium-light skin tone # 8.0 [1] (👨🏼🎓)
+1F468 1F3FC 200D 1F3A4 ; Emoji_ZWJ_Sequence ; man singer: medium-light skin tone # 8.0 [1] (👨🏼🎤)
+1F468 1F3FC 200D 1F3A8 ; Emoji_ZWJ_Sequence ; man artist: medium-light skin tone # 8.0 [1] (👨🏼🎨)
+1F468 1F3FC 200D 1F3EB ; Emoji_ZWJ_Sequence ; man teacher: medium-light skin tone # 8.0 [1] (👨🏼🏫)
+1F468 1F3FC 200D 1F3ED ; Emoji_ZWJ_Sequence ; man factory worker: medium-light skin tone # 8.0 [1] (👨🏼🏭)
+1F468 1F3FC 200D 1F4BB ; Emoji_ZWJ_Sequence ; man technologist: medium-light skin tone # 8.0 [1] (👨🏼💻)
+1F468 1F3FC 200D 1F4BC ; Emoji_ZWJ_Sequence ; man office worker: medium-light skin tone # 8.0 [1] (👨🏼💼)
+1F468 1F3FC 200D 1F527 ; Emoji_ZWJ_Sequence ; man mechanic: medium-light skin tone # 8.0 [1] (👨🏼🔧)
+1F468 1F3FC 200D 1F52C ; Emoji_ZWJ_Sequence ; man scientist: medium-light skin tone # 8.0 [1] (👨🏼🔬)
+1F468 1F3FC 200D 1F680 ; Emoji_ZWJ_Sequence ; man astronaut: medium-light skin tone # 8.0 [1] (👨🏼🚀)
+1F468 1F3FC 200D 1F692 ; Emoji_ZWJ_Sequence ; man firefighter: medium-light skin tone # 8.0 [1] (👨🏼🚒)
+1F468 1F3FC 200D 1F9AF ; Emoji_ZWJ_Sequence ; man with probing cane: medium-light skin tone # 12.0 [1] (👨🏼🦯)
+1F468 1F3FC 200D 1F9BC ; Emoji_ZWJ_Sequence ; man in motorized wheelchair: medium-light skin tone # 12.0 [1] (👨🏼🦼)
+1F468 1F3FC 200D 1F9BD ; Emoji_ZWJ_Sequence ; man in manual wheelchair: medium-light skin tone # 12.0 [1] (👨🏼🦽)
+1F468 1F3FD 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; man health worker: medium skin tone # 8.0 [1] (👨🏽⚕️)
+1F468 1F3FD 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; man judge: medium skin tone # 8.0 [1] (👨🏽⚖️)
+1F468 1F3FD 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; man pilot: medium skin tone # 8.0 [1] (👨🏽✈️)
+1F468 1F3FD 200D 1F33E ; Emoji_ZWJ_Sequence ; man farmer: medium skin tone # 8.0 [1] (👨🏽🌾)
+1F468 1F3FD 200D 1F373 ; Emoji_ZWJ_Sequence ; man cook: medium skin tone # 8.0 [1] (👨🏽🍳)
+1F468 1F3FD 200D 1F393 ; Emoji_ZWJ_Sequence ; man student: medium skin tone # 8.0 [1] (👨🏽🎓)
+1F468 1F3FD 200D 1F3A4 ; Emoji_ZWJ_Sequence ; man singer: medium skin tone # 8.0 [1] (👨🏽🎤)
+1F468 1F3FD 200D 1F3A8 ; Emoji_ZWJ_Sequence ; man artist: medium skin tone # 8.0 [1] (👨🏽🎨)
+1F468 1F3FD 200D 1F3EB ; Emoji_ZWJ_Sequence ; man teacher: medium skin tone # 8.0 [1] (👨🏽🏫)
+1F468 1F3FD 200D 1F3ED ; Emoji_ZWJ_Sequence ; man factory worker: medium skin tone # 8.0 [1] (👨🏽🏭)
+1F468 1F3FD 200D 1F4BB ; Emoji_ZWJ_Sequence ; man technologist: medium skin tone # 8.0 [1] (👨🏽💻)
+1F468 1F3FD 200D 1F4BC ; Emoji_ZWJ_Sequence ; man office worker: medium skin tone # 8.0 [1] (👨🏽💼)
+1F468 1F3FD 200D 1F527 ; Emoji_ZWJ_Sequence ; man mechanic: medium skin tone # 8.0 [1] (👨🏽🔧)
+1F468 1F3FD 200D 1F52C ; Emoji_ZWJ_Sequence ; man scientist: medium skin tone # 8.0 [1] (👨🏽🔬)
+1F468 1F3FD 200D 1F680 ; Emoji_ZWJ_Sequence ; man astronaut: medium skin tone # 8.0 [1] (👨🏽🚀)
+1F468 1F3FD 200D 1F692 ; Emoji_ZWJ_Sequence ; man firefighter: medium skin tone # 8.0 [1] (👨🏽🚒)
+1F468 1F3FD 200D 1F9AF ; Emoji_ZWJ_Sequence ; man with probing cane: medium skin tone # 12.0 [1] (👨🏽🦯)
+1F468 1F3FD 200D 1F9BC ; Emoji_ZWJ_Sequence ; man in motorized wheelchair: medium skin tone # 12.0 [1] (👨🏽🦼)
+1F468 1F3FD 200D 1F9BD ; Emoji_ZWJ_Sequence ; man in manual wheelchair: medium skin tone # 12.0 [1] (👨🏽🦽)
+1F468 1F3FE 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; man health worker: medium-dark skin tone # 8.0 [1] (👨🏾⚕️)
+1F468 1F3FE 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; man judge: medium-dark skin tone # 8.0 [1] (👨🏾⚖️)
+1F468 1F3FE 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; man pilot: medium-dark skin tone # 8.0 [1] (👨🏾✈️)
+1F468 1F3FE 200D 1F33E ; Emoji_ZWJ_Sequence ; man farmer: medium-dark skin tone # 8.0 [1] (👨🏾🌾)
+1F468 1F3FE 200D 1F373 ; Emoji_ZWJ_Sequence ; man cook: medium-dark skin tone # 8.0 [1] (👨🏾🍳)
+1F468 1F3FE 200D 1F393 ; Emoji_ZWJ_Sequence ; man student: medium-dark skin tone # 8.0 [1] (👨🏾🎓)
+1F468 1F3FE 200D 1F3A4 ; Emoji_ZWJ_Sequence ; man singer: medium-dark skin tone # 8.0 [1] (👨🏾🎤)
+1F468 1F3FE 200D 1F3A8 ; Emoji_ZWJ_Sequence ; man artist: medium-dark skin tone # 8.0 [1] (👨🏾🎨)
+1F468 1F3FE 200D 1F3EB ; Emoji_ZWJ_Sequence ; man teacher: medium-dark skin tone # 8.0 [1] (👨🏾🏫)
+1F468 1F3FE 200D 1F3ED ; Emoji_ZWJ_Sequence ; man factory worker: medium-dark skin tone # 8.0 [1] (👨🏾🏭)
+1F468 1F3FE 200D 1F4BB ; Emoji_ZWJ_Sequence ; man technologist: medium-dark skin tone # 8.0 [1] (👨🏾💻)
+1F468 1F3FE 200D 1F4BC ; Emoji_ZWJ_Sequence ; man office worker: medium-dark skin tone # 8.0 [1] (👨🏾💼)
+1F468 1F3FE 200D 1F527 ; Emoji_ZWJ_Sequence ; man mechanic: medium-dark skin tone # 8.0 [1] (👨🏾🔧)
+1F468 1F3FE 200D 1F52C ; Emoji_ZWJ_Sequence ; man scientist: medium-dark skin tone # 8.0 [1] (👨🏾🔬)
+1F468 1F3FE 200D 1F680 ; Emoji_ZWJ_Sequence ; man astronaut: medium-dark skin tone # 8.0 [1] (👨🏾🚀)
+1F468 1F3FE 200D 1F692 ; Emoji_ZWJ_Sequence ; man firefighter: medium-dark skin tone # 8.0 [1] (👨🏾🚒)
+1F468 1F3FE 200D 1F9AF ; Emoji_ZWJ_Sequence ; man with probing cane: medium-dark skin tone # 12.0 [1] (👨🏾🦯)
+1F468 1F3FE 200D 1F9BC ; Emoji_ZWJ_Sequence ; man in motorized wheelchair: medium-dark skin tone # 12.0 [1] (👨🏾🦼)
+1F468 1F3FE 200D 1F9BD ; Emoji_ZWJ_Sequence ; man in manual wheelchair: medium-dark skin tone # 12.0 [1] (👨🏾🦽)
+1F468 1F3FF 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; man health worker: dark skin tone # 8.0 [1] (👨🏿⚕️)
+1F468 1F3FF 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; man judge: dark skin tone # 8.0 [1] (👨🏿⚖️)
+1F468 1F3FF 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; man pilot: dark skin tone # 8.0 [1] (👨🏿✈️)
+1F468 1F3FF 200D 1F33E ; Emoji_ZWJ_Sequence ; man farmer: dark skin tone # 8.0 [1] (👨🏿🌾)
+1F468 1F3FF 200D 1F373 ; Emoji_ZWJ_Sequence ; man cook: dark skin tone # 8.0 [1] (👨🏿🍳)
+1F468 1F3FF 200D 1F393 ; Emoji_ZWJ_Sequence ; man student: dark skin tone # 8.0 [1] (👨🏿🎓)
+1F468 1F3FF 200D 1F3A4 ; Emoji_ZWJ_Sequence ; man singer: dark skin tone # 8.0 [1] (👨🏿🎤)
+1F468 1F3FF 200D 1F3A8 ; Emoji_ZWJ_Sequence ; man artist: dark skin tone # 8.0 [1] (👨🏿🎨)
+1F468 1F3FF 200D 1F3EB ; Emoji_ZWJ_Sequence ; man teacher: dark skin tone # 8.0 [1] (👨🏿🏫)
+1F468 1F3FF 200D 1F3ED ; Emoji_ZWJ_Sequence ; man factory worker: dark skin tone # 8.0 [1] (👨🏿🏭)
+1F468 1F3FF 200D 1F4BB ; Emoji_ZWJ_Sequence ; man technologist: dark skin tone # 8.0 [1] (👨🏿💻)
+1F468 1F3FF 200D 1F4BC ; Emoji_ZWJ_Sequence ; man office worker: dark skin tone # 8.0 [1] (👨🏿💼)
+1F468 1F3FF 200D 1F527 ; Emoji_ZWJ_Sequence ; man mechanic: dark skin tone # 8.0 [1] (👨🏿🔧)
+1F468 1F3FF 200D 1F52C ; Emoji_ZWJ_Sequence ; man scientist: dark skin tone # 8.0 [1] (👨🏿🔬)
+1F468 1F3FF 200D 1F680 ; Emoji_ZWJ_Sequence ; man astronaut: dark skin tone # 8.0 [1] (👨🏿🚀)
+1F468 1F3FF 200D 1F692 ; Emoji_ZWJ_Sequence ; man firefighter: dark skin tone # 8.0 [1] (👨🏿🚒)
+1F468 1F3FF 200D 1F9AF ; Emoji_ZWJ_Sequence ; man with probing cane: dark skin tone # 12.0 [1] (👨🏿🦯)
+1F468 1F3FF 200D 1F9BC ; Emoji_ZWJ_Sequence ; man in motorized wheelchair: dark skin tone # 12.0 [1] (👨🏿🦼)
+1F468 1F3FF 200D 1F9BD ; Emoji_ZWJ_Sequence ; man in manual wheelchair: dark skin tone # 12.0 [1] (👨🏿🦽)
+1F469 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; woman health worker # 6.0 [1] (👩⚕️)
+1F469 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; woman judge # 6.0 [1] (👩⚖️)
+1F469 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; woman pilot # 6.0 [1] (👩✈️)
+1F469 200D 1F33E ; Emoji_ZWJ_Sequence ; woman farmer # 6.0 [1] (👩🌾)
+1F469 200D 1F373 ; Emoji_ZWJ_Sequence ; woman cook # 6.0 [1] (👩🍳)
+1F469 200D 1F393 ; Emoji_ZWJ_Sequence ; woman student # 6.0 [1] (👩🎓)
+1F469 200D 1F3A4 ; Emoji_ZWJ_Sequence ; woman singer # 6.0 [1] (👩🎤)
+1F469 200D 1F3A8 ; Emoji_ZWJ_Sequence ; woman artist # 6.0 [1] (👩🎨)
+1F469 200D 1F3EB ; Emoji_ZWJ_Sequence ; woman teacher # 6.0 [1] (👩🏫)
+1F469 200D 1F3ED ; Emoji_ZWJ_Sequence ; woman factory worker # 6.0 [1] (👩🏭)
+1F469 200D 1F4BB ; Emoji_ZWJ_Sequence ; woman technologist # 6.0 [1] (👩💻)
+1F469 200D 1F4BC ; Emoji_ZWJ_Sequence ; woman office worker # 6.0 [1] (👩💼)
+1F469 200D 1F527 ; Emoji_ZWJ_Sequence ; woman mechanic # 6.0 [1] (👩🔧)
+1F469 200D 1F52C ; Emoji_ZWJ_Sequence ; woman scientist # 6.0 [1] (👩🔬)
+1F469 200D 1F680 ; Emoji_ZWJ_Sequence ; woman astronaut # 6.0 [1] (👩🚀)
+1F469 200D 1F692 ; Emoji_ZWJ_Sequence ; woman firefighter # 6.0 [1] (👩🚒)
+1F469 200D 1F9AF ; Emoji_ZWJ_Sequence ; woman with probing cane # 12.0 [1] (👩🦯)
+1F469 200D 1F9BC ; Emoji_ZWJ_Sequence ; woman in motorized wheelchair # 12.0 [1] (👩🦼)
+1F469 200D 1F9BD ; Emoji_ZWJ_Sequence ; woman in manual wheelchair # 12.0 [1] (👩🦽)
+1F469 1F3FB 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; woman health worker: light skin tone # 8.0 [1] (👩🏻⚕️)
+1F469 1F3FB 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; woman judge: light skin tone # 8.0 [1] (👩🏻⚖️)
+1F469 1F3FB 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; woman pilot: light skin tone # 8.0 [1] (👩🏻✈️)
+1F469 1F3FB 200D 1F33E ; Emoji_ZWJ_Sequence ; woman farmer: light skin tone # 8.0 [1] (👩🏻🌾)
+1F469 1F3FB 200D 1F373 ; Emoji_ZWJ_Sequence ; woman cook: light skin tone # 8.0 [1] (👩🏻🍳)
+1F469 1F3FB 200D 1F393 ; Emoji_ZWJ_Sequence ; woman student: light skin tone # 8.0 [1] (👩🏻🎓)
+1F469 1F3FB 200D 1F3A4 ; Emoji_ZWJ_Sequence ; woman singer: light skin tone # 8.0 [1] (👩🏻🎤)
+1F469 1F3FB 200D 1F3A8 ; Emoji_ZWJ_Sequence ; woman artist: light skin tone # 8.0 [1] (👩🏻🎨)
+1F469 1F3FB 200D 1F3EB ; Emoji_ZWJ_Sequence ; woman teacher: light skin tone # 8.0 [1] (👩🏻🏫)
+1F469 1F3FB 200D 1F3ED ; Emoji_ZWJ_Sequence ; woman factory worker: light skin tone # 8.0 [1] (👩🏻🏭)
+1F469 1F3FB 200D 1F4BB ; Emoji_ZWJ_Sequence ; woman technologist: light skin tone # 8.0 [1] (👩🏻💻)
+1F469 1F3FB 200D 1F4BC ; Emoji_ZWJ_Sequence ; woman office worker: light skin tone # 8.0 [1] (👩🏻💼)
+1F469 1F3FB 200D 1F527 ; Emoji_ZWJ_Sequence ; woman mechanic: light skin tone # 8.0 [1] (👩🏻🔧)
+1F469 1F3FB 200D 1F52C ; Emoji_ZWJ_Sequence ; woman scientist: light skin tone # 8.0 [1] (👩🏻🔬)
+1F469 1F3FB 200D 1F680 ; Emoji_ZWJ_Sequence ; woman astronaut: light skin tone # 8.0 [1] (👩🏻🚀)
+1F469 1F3FB 200D 1F692 ; Emoji_ZWJ_Sequence ; woman firefighter: light skin tone # 8.0 [1] (👩🏻🚒)
+1F469 1F3FB 200D 1F9AF ; Emoji_ZWJ_Sequence ; woman with probing cane: light skin tone # 12.0 [1] (👩🏻🦯)
+1F469 1F3FB 200D 1F9BC ; Emoji_ZWJ_Sequence ; woman in motorized wheelchair: light skin tone # 12.0 [1] (👩🏻🦼)
+1F469 1F3FB 200D 1F9BD ; Emoji_ZWJ_Sequence ; woman in manual wheelchair: light skin tone # 12.0 [1] (👩🏻🦽)
+1F469 1F3FC 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; woman health worker: medium-light skin tone # 8.0 [1] (👩🏼⚕️)
+1F469 1F3FC 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; woman judge: medium-light skin tone # 8.0 [1] (👩🏼⚖️)
+1F469 1F3FC 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; woman pilot: medium-light skin tone # 8.0 [1] (👩🏼✈️)
+1F469 1F3FC 200D 1F33E ; Emoji_ZWJ_Sequence ; woman farmer: medium-light skin tone # 8.0 [1] (👩🏼🌾)
+1F469 1F3FC 200D 1F373 ; Emoji_ZWJ_Sequence ; woman cook: medium-light skin tone # 8.0 [1] (👩🏼🍳)
+1F469 1F3FC 200D 1F393 ; Emoji_ZWJ_Sequence ; woman student: medium-light skin tone # 8.0 [1] (👩🏼🎓)
+1F469 1F3FC 200D 1F3A4 ; Emoji_ZWJ_Sequence ; woman singer: medium-light skin tone # 8.0 [1] (👩🏼🎤)
+1F469 1F3FC 200D 1F3A8 ; Emoji_ZWJ_Sequence ; woman artist: medium-light skin tone # 8.0 [1] (👩🏼🎨)
+1F469 1F3FC 200D 1F3EB ; Emoji_ZWJ_Sequence ; woman teacher: medium-light skin tone # 8.0 [1] (👩🏼🏫)
+1F469 1F3FC 200D 1F3ED ; Emoji_ZWJ_Sequence ; woman factory worker: medium-light skin tone # 8.0 [1] (👩🏼🏭)
+1F469 1F3FC 200D 1F4BB ; Emoji_ZWJ_Sequence ; woman technologist: medium-light skin tone # 8.0 [1] (👩🏼💻)
+1F469 1F3FC 200D 1F4BC ; Emoji_ZWJ_Sequence ; woman office worker: medium-light skin tone # 8.0 [1] (👩🏼💼)
+1F469 1F3FC 200D 1F527 ; Emoji_ZWJ_Sequence ; woman mechanic: medium-light skin tone # 8.0 [1] (👩🏼🔧)
+1F469 1F3FC 200D 1F52C ; Emoji_ZWJ_Sequence ; woman scientist: medium-light skin tone # 8.0 [1] (👩🏼🔬)
+1F469 1F3FC 200D 1F680 ; Emoji_ZWJ_Sequence ; woman astronaut: medium-light skin tone # 8.0 [1] (👩🏼🚀)
+1F469 1F3FC 200D 1F692 ; Emoji_ZWJ_Sequence ; woman firefighter: medium-light skin tone # 8.0 [1] (👩🏼🚒)
+1F469 1F3FC 200D 1F9AF ; Emoji_ZWJ_Sequence ; woman with probing cane: medium-light skin tone # 12.0 [1] (👩🏼🦯)
+1F469 1F3FC 200D 1F9BC ; Emoji_ZWJ_Sequence ; woman in motorized wheelchair: medium-light skin tone # 12.0 [1] (👩🏼🦼)
+1F469 1F3FC 200D 1F9BD ; Emoji_ZWJ_Sequence ; woman in manual wheelchair: medium-light skin tone # 12.0 [1] (👩🏼🦽)
+1F469 1F3FD 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; woman health worker: medium skin tone # 8.0 [1] (👩🏽⚕️)
+1F469 1F3FD 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; woman judge: medium skin tone # 8.0 [1] (👩🏽⚖️)
+1F469 1F3FD 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; woman pilot: medium skin tone # 8.0 [1] (👩🏽✈️)
+1F469 1F3FD 200D 1F33E ; Emoji_ZWJ_Sequence ; woman farmer: medium skin tone # 8.0 [1] (👩🏽🌾)
+1F469 1F3FD 200D 1F373 ; Emoji_ZWJ_Sequence ; woman cook: medium skin tone # 8.0 [1] (👩🏽🍳)
+1F469 1F3FD 200D 1F393 ; Emoji_ZWJ_Sequence ; woman student: medium skin tone # 8.0 [1] (👩🏽🎓)
+1F469 1F3FD 200D 1F3A4 ; Emoji_ZWJ_Sequence ; woman singer: medium skin tone # 8.0 [1] (👩🏽🎤)
+1F469 1F3FD 200D 1F3A8 ; Emoji_ZWJ_Sequence ; woman artist: medium skin tone # 8.0 [1] (👩🏽🎨)
+1F469 1F3FD 200D 1F3EB ; Emoji_ZWJ_Sequence ; woman teacher: medium skin tone # 8.0 [1] (👩🏽🏫)
+1F469 1F3FD 200D 1F3ED ; Emoji_ZWJ_Sequence ; woman factory worker: medium skin tone # 8.0 [1] (👩🏽🏭)
+1F469 1F3FD 200D 1F4BB ; Emoji_ZWJ_Sequence ; woman technologist: medium skin tone # 8.0 [1] (👩🏽💻)
+1F469 1F3FD 200D 1F4BC ; Emoji_ZWJ_Sequence ; woman office worker: medium skin tone # 8.0 [1] (👩🏽💼)
+1F469 1F3FD 200D 1F527 ; Emoji_ZWJ_Sequence ; woman mechanic: medium skin tone # 8.0 [1] (👩🏽🔧)
+1F469 1F3FD 200D 1F52C ; Emoji_ZWJ_Sequence ; woman scientist: medium skin tone # 8.0 [1] (👩🏽🔬)
+1F469 1F3FD 200D 1F680 ; Emoji_ZWJ_Sequence ; woman astronaut: medium skin tone # 8.0 [1] (👩🏽🚀)
+1F469 1F3FD 200D 1F692 ; Emoji_ZWJ_Sequence ; woman firefighter: medium skin tone # 8.0 [1] (👩🏽🚒)
+1F469 1F3FD 200D 1F9AF ; Emoji_ZWJ_Sequence ; woman with probing cane: medium skin tone # 12.0 [1] (👩🏽🦯)
+1F469 1F3FD 200D 1F9BC ; Emoji_ZWJ_Sequence ; woman in motorized wheelchair: medium skin tone # 12.0 [1] (👩🏽🦼)
+1F469 1F3FD 200D 1F9BD ; Emoji_ZWJ_Sequence ; woman in manual wheelchair: medium skin tone # 12.0 [1] (👩🏽🦽)
+1F469 1F3FE 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; woman health worker: medium-dark skin tone # 8.0 [1] (👩🏾⚕️)
+1F469 1F3FE 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; woman judge: medium-dark skin tone # 8.0 [1] (👩🏾⚖️)
+1F469 1F3FE 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; woman pilot: medium-dark skin tone # 8.0 [1] (👩🏾✈️)
+1F469 1F3FE 200D 1F33E ; Emoji_ZWJ_Sequence ; woman farmer: medium-dark skin tone # 8.0 [1] (👩🏾🌾)
+1F469 1F3FE 200D 1F373 ; Emoji_ZWJ_Sequence ; woman cook: medium-dark skin tone # 8.0 [1] (👩🏾🍳)
+1F469 1F3FE 200D 1F393 ; Emoji_ZWJ_Sequence ; woman student: medium-dark skin tone # 8.0 [1] (👩🏾🎓)
+1F469 1F3FE 200D 1F3A4 ; Emoji_ZWJ_Sequence ; woman singer: medium-dark skin tone # 8.0 [1] (👩🏾🎤)
+1F469 1F3FE 200D 1F3A8 ; Emoji_ZWJ_Sequence ; woman artist: medium-dark skin tone # 8.0 [1] (👩🏾🎨)
+1F469 1F3FE 200D 1F3EB ; Emoji_ZWJ_Sequence ; woman teacher: medium-dark skin tone # 8.0 [1] (👩🏾🏫)
+1F469 1F3FE 200D 1F3ED ; Emoji_ZWJ_Sequence ; woman factory worker: medium-dark skin tone # 8.0 [1] (👩🏾🏭)
+1F469 1F3FE 200D 1F4BB ; Emoji_ZWJ_Sequence ; woman technologist: medium-dark skin tone # 8.0 [1] (👩🏾💻)
+1F469 1F3FE 200D 1F4BC ; Emoji_ZWJ_Sequence ; woman office worker: medium-dark skin tone # 8.0 [1] (👩🏾💼)
+1F469 1F3FE 200D 1F527 ; Emoji_ZWJ_Sequence ; woman mechanic: medium-dark skin tone # 8.0 [1] (👩🏾🔧)
+1F469 1F3FE 200D 1F52C ; Emoji_ZWJ_Sequence ; woman scientist: medium-dark skin tone # 8.0 [1] (👩🏾🔬)
+1F469 1F3FE 200D 1F680 ; Emoji_ZWJ_Sequence ; woman astronaut: medium-dark skin tone # 8.0 [1] (👩🏾🚀)
+1F469 1F3FE 200D 1F692 ; Emoji_ZWJ_Sequence ; woman firefighter: medium-dark skin tone # 8.0 [1] (👩🏾🚒)
+1F469 1F3FE 200D 1F9AF ; Emoji_ZWJ_Sequence ; woman with probing cane: medium-dark skin tone # 12.0 [1] (👩🏾🦯)
+1F469 1F3FE 200D 1F9BC ; Emoji_ZWJ_Sequence ; woman in motorized wheelchair: medium-dark skin tone # 12.0 [1] (👩🏾🦼)
+1F469 1F3FE 200D 1F9BD ; Emoji_ZWJ_Sequence ; woman in manual wheelchair: medium-dark skin tone # 12.0 [1] (👩🏾🦽)
+1F469 1F3FF 200D 2695 FE0F ; Emoji_ZWJ_Sequence ; woman health worker: dark skin tone # 8.0 [1] (👩🏿⚕️)
+1F469 1F3FF 200D 2696 FE0F ; Emoji_ZWJ_Sequence ; woman judge: dark skin tone # 8.0 [1] (👩🏿⚖️)
+1F469 1F3FF 200D 2708 FE0F ; Emoji_ZWJ_Sequence ; woman pilot: dark skin tone # 8.0 [1] (👩🏿✈️)
+1F469 1F3FF 200D 1F33E ; Emoji_ZWJ_Sequence ; woman farmer: dark skin tone # 8.0 [1] (👩🏿🌾)
+1F469 1F3FF 200D 1F373 ; Emoji_ZWJ_Sequence ; woman cook: dark skin tone # 8.0 [1] (👩🏿🍳)
+1F469 1F3FF 200D 1F393 ; Emoji_ZWJ_Sequence ; woman student: dark skin tone # 8.0 [1] (👩🏿🎓)
+1F469 1F3FF 200D 1F3A4 ; Emoji_ZWJ_Sequence ; woman singer: dark skin tone # 8.0 [1] (👩🏿🎤)
+1F469 1F3FF 200D 1F3A8 ; Emoji_ZWJ_Sequence ; woman artist: dark skin tone # 8.0 [1] (👩🏿🎨)
+1F469 1F3FF 200D 1F3EB ; Emoji_ZWJ_Sequence ; woman teacher: dark skin tone # 8.0 [1] (👩🏿🏫)
+1F469 1F3FF 200D 1F3ED ; Emoji_ZWJ_Sequence ; woman factory worker: dark skin tone # 8.0 [1] (👩🏿🏭)
+1F469 1F3FF 200D 1F4BB ; Emoji_ZWJ_Sequence ; woman technologist: dark skin tone # 8.0 [1] (👩🏿💻)
+1F469 1F3FF 200D 1F4BC ; Emoji_ZWJ_Sequence ; woman office worker: dark skin tone # 8.0 [1] (👩🏿💼)
+1F469 1F3FF 200D 1F527 ; Emoji_ZWJ_Sequence ; woman mechanic: dark skin tone # 8.0 [1] (👩🏿🔧)
+1F469 1F3FF 200D 1F52C ; Emoji_ZWJ_Sequence ; woman scientist: dark skin tone # 8.0 [1] (👩🏿🔬)
+1F469 1F3FF 200D 1F680 ; Emoji_ZWJ_Sequence ; woman astronaut: dark skin tone # 8.0 [1] (👩🏿🚀)
+1F469 1F3FF 200D 1F692 ; Emoji_ZWJ_Sequence ; woman firefighter: dark skin tone # 8.0 [1] (👩🏿🚒)
+1F469 1F3FF 200D 1F9AF ; Emoji_ZWJ_Sequence ; woman with probing cane: dark skin tone # 12.0 [1] (👩🏿🦯)
+1F469 1F3FF 200D 1F9BC ; Emoji_ZWJ_Sequence ; woman in motorized wheelchair: dark skin tone # 12.0 [1] (👩🏿🦼)
+1F469 1F3FF 200D 1F9BD ; Emoji_ZWJ_Sequence ; woman in manual wheelchair: dark skin tone # 12.0 [1] (👩🏿🦽)
+
+# Total elements: 228
+
+# ================================================
+
+# Emoji_ZWJ_Sequence: Gendered
+
+26F9 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bouncing ball: light skin tone # 8.0 [1] (⛹🏻♀️)
+26F9 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bouncing ball: light skin tone # 8.0 [1] (⛹🏻♂️)
+26F9 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bouncing ball: medium-light skin tone # 8.0 [1] (⛹🏼♀️)
+26F9 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bouncing ball: medium-light skin tone # 8.0 [1] (⛹🏼♂️)
+26F9 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bouncing ball: medium skin tone # 8.0 [1] (⛹🏽♀️)
+26F9 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bouncing ball: medium skin tone # 8.0 [1] (⛹🏽♂️)
+26F9 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bouncing ball: medium-dark skin tone # 8.0 [1] (⛹🏾♀️)
+26F9 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bouncing ball: medium-dark skin tone # 8.0 [1] (⛹🏾♂️)
+26F9 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bouncing ball: dark skin tone # 8.0 [1] (⛹🏿♀️)
+26F9 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bouncing ball: dark skin tone # 8.0 [1] (⛹🏿♂️)
+26F9 FE0F 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bouncing ball # 5.2 [1] (⛹️♀️)
+26F9 FE0F 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bouncing ball # 5.2 [1] (⛹️♂️)
+1F3C3 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman running # 6.0 [1] (🏃♀️)
+1F3C3 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man running # 6.0 [1] (🏃♂️)
+1F3C3 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman running: light skin tone # 8.0 [1] (🏃🏻♀️)
+1F3C3 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man running: light skin tone # 8.0 [1] (🏃🏻♂️)
+1F3C3 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman running: medium-light skin tone # 8.0 [1] (🏃🏼♀️)
+1F3C3 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man running: medium-light skin tone # 8.0 [1] (🏃🏼♂️)
+1F3C3 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman running: medium skin tone # 8.0 [1] (🏃🏽♀️)
+1F3C3 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man running: medium skin tone # 8.0 [1] (🏃🏽♂️)
+1F3C3 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman running: medium-dark skin tone # 8.0 [1] (🏃🏾♀️)
+1F3C3 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man running: medium-dark skin tone # 8.0 [1] (🏃🏾♂️)
+1F3C3 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman running: dark skin tone # 8.0 [1] (🏃🏿♀️)
+1F3C3 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man running: dark skin tone # 8.0 [1] (🏃🏿♂️)
+1F3C4 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman surfing # 6.0 [1] (🏄♀️)
+1F3C4 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man surfing # 6.0 [1] (🏄♂️)
+1F3C4 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman surfing: light skin tone # 8.0 [1] (🏄🏻♀️)
+1F3C4 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man surfing: light skin tone # 8.0 [1] (🏄🏻♂️)
+1F3C4 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman surfing: medium-light skin tone # 8.0 [1] (🏄🏼♀️)
+1F3C4 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man surfing: medium-light skin tone # 8.0 [1] (🏄🏼♂️)
+1F3C4 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman surfing: medium skin tone # 8.0 [1] (🏄🏽♀️)
+1F3C4 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man surfing: medium skin tone # 8.0 [1] (🏄🏽♂️)
+1F3C4 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman surfing: medium-dark skin tone # 8.0 [1] (🏄🏾♀️)
+1F3C4 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man surfing: medium-dark skin tone # 8.0 [1] (🏄🏾♂️)
+1F3C4 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman surfing: dark skin tone # 8.0 [1] (🏄🏿♀️)
+1F3C4 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man surfing: dark skin tone # 8.0 [1] (🏄🏿♂️)
+1F3CA 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman swimming # 6.0 [1] (🏊♀️)
+1F3CA 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man swimming # 6.0 [1] (🏊♂️)
+1F3CA 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman swimming: light skin tone # 8.0 [1] (🏊🏻♀️)
+1F3CA 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man swimming: light skin tone # 8.0 [1] (🏊🏻♂️)
+1F3CA 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman swimming: medium-light skin tone # 8.0 [1] (🏊🏼♀️)
+1F3CA 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man swimming: medium-light skin tone # 8.0 [1] (🏊🏼♂️)
+1F3CA 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman swimming: medium skin tone # 8.0 [1] (🏊🏽♀️)
+1F3CA 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man swimming: medium skin tone # 8.0 [1] (🏊🏽♂️)
+1F3CA 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman swimming: medium-dark skin tone # 8.0 [1] (🏊🏾♀️)
+1F3CA 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man swimming: medium-dark skin tone # 8.0 [1] (🏊🏾♂️)
+1F3CA 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman swimming: dark skin tone # 8.0 [1] (🏊🏿♀️)
+1F3CA 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man swimming: dark skin tone # 8.0 [1] (🏊🏿♂️)
+1F3CB 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman lifting weights: light skin tone # 8.0 [1] (🏋🏻♀️)
+1F3CB 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man lifting weights: light skin tone # 8.0 [1] (🏋🏻♂️)
+1F3CB 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman lifting weights: medium-light skin tone # 8.0 [1] (🏋🏼♀️)
+1F3CB 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man lifting weights: medium-light skin tone # 8.0 [1] (🏋🏼♂️)
+1F3CB 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman lifting weights: medium skin tone # 8.0 [1] (🏋🏽♀️)
+1F3CB 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man lifting weights: medium skin tone # 8.0 [1] (🏋🏽♂️)
+1F3CB 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman lifting weights: medium-dark skin tone # 8.0 [1] (🏋🏾♀️)
+1F3CB 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man lifting weights: medium-dark skin tone # 8.0 [1] (🏋🏾♂️)
+1F3CB 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman lifting weights: dark skin tone # 8.0 [1] (🏋🏿♀️)
+1F3CB 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man lifting weights: dark skin tone # 8.0 [1] (🏋🏿♂️)
+1F3CB FE0F 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman lifting weights # 7.0 [1] (🏋️♀️)
+1F3CB FE0F 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man lifting weights # 7.0 [1] (🏋️♂️)
+1F3CC 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman golfing: light skin tone # 8.0 [1] (🏌🏻♀️)
+1F3CC 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man golfing: light skin tone # 8.0 [1] (🏌🏻♂️)
+1F3CC 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman golfing: medium-light skin tone # 8.0 [1] (🏌🏼♀️)
+1F3CC 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man golfing: medium-light skin tone # 8.0 [1] (🏌🏼♂️)
+1F3CC 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman golfing: medium skin tone # 8.0 [1] (🏌🏽♀️)
+1F3CC 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man golfing: medium skin tone # 8.0 [1] (🏌🏽♂️)
+1F3CC 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman golfing: medium-dark skin tone # 8.0 [1] (🏌🏾♀️)
+1F3CC 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man golfing: medium-dark skin tone # 8.0 [1] (🏌🏾♂️)
+1F3CC 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman golfing: dark skin tone # 8.0 [1] (🏌🏿♀️)
+1F3CC 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man golfing: dark skin tone # 8.0 [1] (🏌🏿♂️)
+1F3CC FE0F 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman golfing # 7.0 [1] (🏌️♀️)
+1F3CC FE0F 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man golfing # 7.0 [1] (🏌️♂️)
+1F46E 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman police officer # 6.0 [1] (👮♀️)
+1F46E 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man police officer # 6.0 [1] (👮♂️)
+1F46E 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman police officer: light skin tone # 8.0 [1] (👮🏻♀️)
+1F46E 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man police officer: light skin tone # 8.0 [1] (👮🏻♂️)
+1F46E 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman police officer: medium-light skin tone # 8.0 [1] (👮🏼♀️)
+1F46E 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man police officer: medium-light skin tone # 8.0 [1] (👮🏼♂️)
+1F46E 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman police officer: medium skin tone # 8.0 [1] (👮🏽♀️)
+1F46E 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man police officer: medium skin tone # 8.0 [1] (👮🏽♂️)
+1F46E 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman police officer: medium-dark skin tone # 8.0 [1] (👮🏾♀️)
+1F46E 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man police officer: medium-dark skin tone # 8.0 [1] (👮🏾♂️)
+1F46E 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman police officer: dark skin tone # 8.0 [1] (👮🏿♀️)
+1F46E 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man police officer: dark skin tone # 8.0 [1] (👮🏿♂️)
+1F46F 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; women with bunny ears # 6.0 [1] (👯♀️)
+1F46F 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; men with bunny ears # 6.0 [1] (👯♂️)
+1F471 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman: blond hair # 6.0 [1] (👱♀️)
+1F471 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man: blond hair # 6.0 [1] (👱♂️)
+1F471 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman: light skin tone, blond hair # 8.0 [1] (👱🏻♀️)
+1F471 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man: light skin tone, blond hair # 8.0 [1] (👱🏻♂️)
+1F471 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman: medium-light skin tone, blond hair # 8.0 [1] (👱🏼♀️)
+1F471 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man: medium-light skin tone, blond hair # 8.0 [1] (👱🏼♂️)
+1F471 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman: medium skin tone, blond hair # 8.0 [1] (👱🏽♀️)
+1F471 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man: medium skin tone, blond hair # 8.0 [1] (👱🏽♂️)
+1F471 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman: medium-dark skin tone, blond hair # 8.0 [1] (👱🏾♀️)
+1F471 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man: medium-dark skin tone, blond hair # 8.0 [1] (👱🏾♂️)
+1F471 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman: dark skin tone, blond hair # 8.0 [1] (👱🏿♀️)
+1F471 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man: dark skin tone, blond hair # 8.0 [1] (👱🏿♂️)
+1F473 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman wearing turban # 6.0 [1] (👳♀️)
+1F473 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man wearing turban # 6.0 [1] (👳♂️)
+1F473 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman wearing turban: light skin tone # 8.0 [1] (👳🏻♀️)
+1F473 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man wearing turban: light skin tone # 8.0 [1] (👳🏻♂️)
+1F473 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman wearing turban: medium-light skin tone # 8.0 [1] (👳🏼♀️)
+1F473 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man wearing turban: medium-light skin tone # 8.0 [1] (👳🏼♂️)
+1F473 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman wearing turban: medium skin tone # 8.0 [1] (👳🏽♀️)
+1F473 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man wearing turban: medium skin tone # 8.0 [1] (👳🏽♂️)
+1F473 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman wearing turban: medium-dark skin tone # 8.0 [1] (👳🏾♀️)
+1F473 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man wearing turban: medium-dark skin tone # 8.0 [1] (👳🏾♂️)
+1F473 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman wearing turban: dark skin tone # 8.0 [1] (👳🏿♀️)
+1F473 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man wearing turban: dark skin tone # 8.0 [1] (👳🏿♂️)
+1F477 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman construction worker # 6.0 [1] (👷♀️)
+1F477 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man construction worker # 6.0 [1] (👷♂️)
+1F477 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman construction worker: light skin tone # 8.0 [1] (👷🏻♀️)
+1F477 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man construction worker: light skin tone # 8.0 [1] (👷🏻♂️)
+1F477 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman construction worker: medium-light skin tone # 8.0 [1] (👷🏼♀️)
+1F477 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man construction worker: medium-light skin tone # 8.0 [1] (👷🏼♂️)
+1F477 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman construction worker: medium skin tone # 8.0 [1] (👷🏽♀️)
+1F477 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man construction worker: medium skin tone # 8.0 [1] (👷🏽♂️)
+1F477 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman construction worker: medium-dark skin tone # 8.0 [1] (👷🏾♀️)
+1F477 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man construction worker: medium-dark skin tone # 8.0 [1] (👷🏾♂️)
+1F477 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman construction worker: dark skin tone # 8.0 [1] (👷🏿♀️)
+1F477 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man construction worker: dark skin tone # 8.0 [1] (👷🏿♂️)
+1F481 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman tipping hand # 6.0 [1] (💁♀️)
+1F481 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man tipping hand # 6.0 [1] (💁♂️)
+1F481 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman tipping hand: light skin tone # 8.0 [1] (💁🏻♀️)
+1F481 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man tipping hand: light skin tone # 8.0 [1] (💁🏻♂️)
+1F481 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman tipping hand: medium-light skin tone # 8.0 [1] (💁🏼♀️)
+1F481 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man tipping hand: medium-light skin tone # 8.0 [1] (💁🏼♂️)
+1F481 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman tipping hand: medium skin tone # 8.0 [1] (💁🏽♀️)
+1F481 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man tipping hand: medium skin tone # 8.0 [1] (💁🏽♂️)
+1F481 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman tipping hand: medium-dark skin tone # 8.0 [1] (💁🏾♀️)
+1F481 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man tipping hand: medium-dark skin tone # 8.0 [1] (💁🏾♂️)
+1F481 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman tipping hand: dark skin tone # 8.0 [1] (💁🏿♀️)
+1F481 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man tipping hand: dark skin tone # 8.0 [1] (💁🏿♂️)
+1F482 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman guard # 6.0 [1] (💂♀️)
+1F482 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man guard # 6.0 [1] (💂♂️)
+1F482 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman guard: light skin tone # 8.0 [1] (💂🏻♀️)
+1F482 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man guard: light skin tone # 8.0 [1] (💂🏻♂️)
+1F482 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman guard: medium-light skin tone # 8.0 [1] (💂🏼♀️)
+1F482 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man guard: medium-light skin tone # 8.0 [1] (💂🏼♂️)
+1F482 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman guard: medium skin tone # 8.0 [1] (💂🏽♀️)
+1F482 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man guard: medium skin tone # 8.0 [1] (💂🏽♂️)
+1F482 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman guard: medium-dark skin tone # 8.0 [1] (💂🏾♀️)
+1F482 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man guard: medium-dark skin tone # 8.0 [1] (💂🏾♂️)
+1F482 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman guard: dark skin tone # 8.0 [1] (💂🏿♀️)
+1F482 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man guard: dark skin tone # 8.0 [1] (💂🏿♂️)
+1F486 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting massage # 6.0 [1] (💆♀️)
+1F486 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting massage # 6.0 [1] (💆♂️)
+1F486 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting massage: light skin tone # 8.0 [1] (💆🏻♀️)
+1F486 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting massage: light skin tone # 8.0 [1] (💆🏻♂️)
+1F486 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting massage: medium-light skin tone # 8.0 [1] (💆🏼♀️)
+1F486 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting massage: medium-light skin tone # 8.0 [1] (💆🏼♂️)
+1F486 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting massage: medium skin tone # 8.0 [1] (💆🏽♀️)
+1F486 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting massage: medium skin tone # 8.0 [1] (💆🏽♂️)
+1F486 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting massage: medium-dark skin tone # 8.0 [1] (💆🏾♀️)
+1F486 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting massage: medium-dark skin tone # 8.0 [1] (💆🏾♂️)
+1F486 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting massage: dark skin tone # 8.0 [1] (💆🏿♀️)
+1F486 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting massage: dark skin tone # 8.0 [1] (💆🏿♂️)
+1F487 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting haircut # 6.0 [1] (💇♀️)
+1F487 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting haircut # 6.0 [1] (💇♂️)
+1F487 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting haircut: light skin tone # 8.0 [1] (💇🏻♀️)
+1F487 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting haircut: light skin tone # 8.0 [1] (💇🏻♂️)
+1F487 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting haircut: medium-light skin tone # 8.0 [1] (💇🏼♀️)
+1F487 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting haircut: medium-light skin tone # 8.0 [1] (💇🏼♂️)
+1F487 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting haircut: medium skin tone # 8.0 [1] (💇🏽♀️)
+1F487 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting haircut: medium skin tone # 8.0 [1] (💇🏽♂️)
+1F487 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting haircut: medium-dark skin tone # 8.0 [1] (💇🏾♀️)
+1F487 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting haircut: medium-dark skin tone # 8.0 [1] (💇🏾♂️)
+1F487 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman getting haircut: dark skin tone # 8.0 [1] (💇🏿♀️)
+1F487 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man getting haircut: dark skin tone # 8.0 [1] (💇🏿♂️)
+1F575 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman detective: light skin tone # 8.0 [1] (🕵🏻♀️)
+1F575 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man detective: light skin tone # 8.0 [1] (🕵🏻♂️)
+1F575 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman detective: medium-light skin tone # 8.0 [1] (🕵🏼♀️)
+1F575 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man detective: medium-light skin tone # 8.0 [1] (🕵🏼♂️)
+1F575 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman detective: medium skin tone # 8.0 [1] (🕵🏽♀️)
+1F575 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man detective: medium skin tone # 8.0 [1] (🕵🏽♂️)
+1F575 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman detective: medium-dark skin tone # 8.0 [1] (🕵🏾♀️)
+1F575 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man detective: medium-dark skin tone # 8.0 [1] (🕵🏾♂️)
+1F575 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman detective: dark skin tone # 8.0 [1] (🕵🏿♀️)
+1F575 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man detective: dark skin tone # 8.0 [1] (🕵🏿♂️)
+1F575 FE0F 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman detective # 7.0 [1] (🕵️♀️)
+1F575 FE0F 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man detective # 7.0 [1] (🕵️♂️)
+1F645 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing NO # 6.0 [1] (🙅♀️)
+1F645 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing NO # 6.0 [1] (🙅♂️)
+1F645 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing NO: light skin tone # 8.0 [1] (🙅🏻♀️)
+1F645 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing NO: light skin tone # 8.0 [1] (🙅🏻♂️)
+1F645 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing NO: medium-light skin tone # 8.0 [1] (🙅🏼♀️)
+1F645 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing NO: medium-light skin tone # 8.0 [1] (🙅🏼♂️)
+1F645 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing NO: medium skin tone # 8.0 [1] (🙅🏽♀️)
+1F645 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing NO: medium skin tone # 8.0 [1] (🙅🏽♂️)
+1F645 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing NO: medium-dark skin tone # 8.0 [1] (🙅🏾♀️)
+1F645 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing NO: medium-dark skin tone # 8.0 [1] (🙅🏾♂️)
+1F645 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing NO: dark skin tone # 8.0 [1] (🙅🏿♀️)
+1F645 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing NO: dark skin tone # 8.0 [1] (🙅🏿♂️)
+1F646 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing OK # 6.0 [1] (🙆♀️)
+1F646 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing OK # 6.0 [1] (🙆♂️)
+1F646 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing OK: light skin tone # 8.0 [1] (🙆🏻♀️)
+1F646 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing OK: light skin tone # 8.0 [1] (🙆🏻♂️)
+1F646 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing OK: medium-light skin tone # 8.0 [1] (🙆🏼♀️)
+1F646 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing OK: medium-light skin tone # 8.0 [1] (🙆🏼♂️)
+1F646 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing OK: medium skin tone # 8.0 [1] (🙆🏽♀️)
+1F646 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing OK: medium skin tone # 8.0 [1] (🙆🏽♂️)
+1F646 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing OK: medium-dark skin tone # 8.0 [1] (🙆🏾♀️)
+1F646 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing OK: medium-dark skin tone # 8.0 [1] (🙆🏾♂️)
+1F646 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman gesturing OK: dark skin tone # 8.0 [1] (🙆🏿♀️)
+1F646 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man gesturing OK: dark skin tone # 8.0 [1] (🙆🏿♂️)
+1F647 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bowing # 6.0 [1] (🙇♀️)
+1F647 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bowing # 6.0 [1] (🙇♂️)
+1F647 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bowing: light skin tone # 8.0 [1] (🙇🏻♀️)
+1F647 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bowing: light skin tone # 8.0 [1] (🙇🏻♂️)
+1F647 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bowing: medium-light skin tone # 8.0 [1] (🙇🏼♀️)
+1F647 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bowing: medium-light skin tone # 8.0 [1] (🙇🏼♂️)
+1F647 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bowing: medium skin tone # 8.0 [1] (🙇🏽♀️)
+1F647 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bowing: medium skin tone # 8.0 [1] (🙇🏽♂️)
+1F647 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bowing: medium-dark skin tone # 8.0 [1] (🙇🏾♀️)
+1F647 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bowing: medium-dark skin tone # 8.0 [1] (🙇🏾♂️)
+1F647 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman bowing: dark skin tone # 8.0 [1] (🙇🏿♀️)
+1F647 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man bowing: dark skin tone # 8.0 [1] (🙇🏿♂️)
+1F64B 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman raising hand # 6.0 [1] (🙋♀️)
+1F64B 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man raising hand # 6.0 [1] (🙋♂️)
+1F64B 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman raising hand: light skin tone # 8.0 [1] (🙋🏻♀️)
+1F64B 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man raising hand: light skin tone # 8.0 [1] (🙋🏻♂️)
+1F64B 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman raising hand: medium-light skin tone # 8.0 [1] (🙋🏼♀️)
+1F64B 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man raising hand: medium-light skin tone # 8.0 [1] (🙋🏼♂️)
+1F64B 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman raising hand: medium skin tone # 8.0 [1] (🙋🏽♀️)
+1F64B 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man raising hand: medium skin tone # 8.0 [1] (🙋🏽♂️)
+1F64B 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman raising hand: medium-dark skin tone # 8.0 [1] (🙋🏾♀️)
+1F64B 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man raising hand: medium-dark skin tone # 8.0 [1] (🙋🏾♂️)
+1F64B 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman raising hand: dark skin tone # 8.0 [1] (🙋🏿♀️)
+1F64B 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man raising hand: dark skin tone # 8.0 [1] (🙋🏿♂️)
+1F64D 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman frowning # 6.0 [1] (🙍♀️)
+1F64D 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man frowning # 6.0 [1] (🙍♂️)
+1F64D 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman frowning: light skin tone # 8.0 [1] (🙍🏻♀️)
+1F64D 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man frowning: light skin tone # 8.0 [1] (🙍🏻♂️)
+1F64D 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman frowning: medium-light skin tone # 8.0 [1] (🙍🏼♀️)
+1F64D 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man frowning: medium-light skin tone # 8.0 [1] (🙍🏼♂️)
+1F64D 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman frowning: medium skin tone # 8.0 [1] (🙍🏽♀️)
+1F64D 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man frowning: medium skin tone # 8.0 [1] (🙍🏽♂️)
+1F64D 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman frowning: medium-dark skin tone # 8.0 [1] (🙍🏾♀️)
+1F64D 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man frowning: medium-dark skin tone # 8.0 [1] (🙍🏾♂️)
+1F64D 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman frowning: dark skin tone # 8.0 [1] (🙍🏿♀️)
+1F64D 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man frowning: dark skin tone # 8.0 [1] (🙍🏿♂️)
+1F64E 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman pouting # 6.0 [1] (🙎♀️)
+1F64E 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man pouting # 6.0 [1] (🙎♂️)
+1F64E 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman pouting: light skin tone # 8.0 [1] (🙎🏻♀️)
+1F64E 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man pouting: light skin tone # 8.0 [1] (🙎🏻♂️)
+1F64E 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman pouting: medium-light skin tone # 8.0 [1] (🙎🏼♀️)
+1F64E 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man pouting: medium-light skin tone # 8.0 [1] (🙎🏼♂️)
+1F64E 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman pouting: medium skin tone # 8.0 [1] (🙎🏽♀️)
+1F64E 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man pouting: medium skin tone # 8.0 [1] (🙎🏽♂️)
+1F64E 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman pouting: medium-dark skin tone # 8.0 [1] (🙎🏾♀️)
+1F64E 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man pouting: medium-dark skin tone # 8.0 [1] (🙎🏾♂️)
+1F64E 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman pouting: dark skin tone # 8.0 [1] (🙎🏿♀️)
+1F64E 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man pouting: dark skin tone # 8.0 [1] (🙎🏿♂️)
+1F6A3 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman rowing boat # 6.0 [1] (🚣♀️)
+1F6A3 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man rowing boat # 6.0 [1] (🚣♂️)
+1F6A3 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman rowing boat: light skin tone # 8.0 [1] (🚣🏻♀️)
+1F6A3 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man rowing boat: light skin tone # 8.0 [1] (🚣🏻♂️)
+1F6A3 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman rowing boat: medium-light skin tone # 8.0 [1] (🚣🏼♀️)
+1F6A3 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man rowing boat: medium-light skin tone # 8.0 [1] (🚣🏼♂️)
+1F6A3 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman rowing boat: medium skin tone # 8.0 [1] (🚣🏽♀️)
+1F6A3 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man rowing boat: medium skin tone # 8.0 [1] (🚣🏽♂️)
+1F6A3 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman rowing boat: medium-dark skin tone # 8.0 [1] (🚣🏾♀️)
+1F6A3 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man rowing boat: medium-dark skin tone # 8.0 [1] (🚣🏾♂️)
+1F6A3 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman rowing boat: dark skin tone # 8.0 [1] (🚣🏿♀️)
+1F6A3 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man rowing boat: dark skin tone # 8.0 [1] (🚣🏿♂️)
+1F6B4 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman biking # 6.0 [1] (🚴♀️)
+1F6B4 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man biking # 6.0 [1] (🚴♂️)
+1F6B4 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman biking: light skin tone # 8.0 [1] (🚴🏻♀️)
+1F6B4 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man biking: light skin tone # 8.0 [1] (🚴🏻♂️)
+1F6B4 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman biking: medium-light skin tone # 8.0 [1] (🚴🏼♀️)
+1F6B4 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man biking: medium-light skin tone # 8.0 [1] (🚴🏼♂️)
+1F6B4 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman biking: medium skin tone # 8.0 [1] (🚴🏽♀️)
+1F6B4 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man biking: medium skin tone # 8.0 [1] (🚴🏽♂️)
+1F6B4 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman biking: medium-dark skin tone # 8.0 [1] (🚴🏾♀️)
+1F6B4 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man biking: medium-dark skin tone # 8.0 [1] (🚴🏾♂️)
+1F6B4 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman biking: dark skin tone # 8.0 [1] (🚴🏿♀️)
+1F6B4 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man biking: dark skin tone # 8.0 [1] (🚴🏿♂️)
+1F6B5 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mountain biking # 6.0 [1] (🚵♀️)
+1F6B5 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mountain biking # 6.0 [1] (🚵♂️)
+1F6B5 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mountain biking: light skin tone # 8.0 [1] (🚵🏻♀️)
+1F6B5 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mountain biking: light skin tone # 8.0 [1] (🚵🏻♂️)
+1F6B5 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mountain biking: medium-light skin tone # 8.0 [1] (🚵🏼♀️)
+1F6B5 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mountain biking: medium-light skin tone # 8.0 [1] (🚵🏼♂️)
+1F6B5 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mountain biking: medium skin tone # 8.0 [1] (🚵🏽♀️)
+1F6B5 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mountain biking: medium skin tone # 8.0 [1] (🚵🏽♂️)
+1F6B5 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mountain biking: medium-dark skin tone # 8.0 [1] (🚵🏾♀️)
+1F6B5 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mountain biking: medium-dark skin tone # 8.0 [1] (🚵🏾♂️)
+1F6B5 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mountain biking: dark skin tone # 8.0 [1] (🚵🏿♀️)
+1F6B5 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mountain biking: dark skin tone # 8.0 [1] (🚵🏿♂️)
+1F6B6 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman walking # 6.0 [1] (🚶♀️)
+1F6B6 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man walking # 6.0 [1] (🚶♂️)
+1F6B6 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman walking: light skin tone # 8.0 [1] (🚶🏻♀️)
+1F6B6 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man walking: light skin tone # 8.0 [1] (🚶🏻♂️)
+1F6B6 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman walking: medium-light skin tone # 8.0 [1] (🚶🏼♀️)
+1F6B6 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man walking: medium-light skin tone # 8.0 [1] (🚶🏼♂️)
+1F6B6 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman walking: medium skin tone # 8.0 [1] (🚶🏽♀️)
+1F6B6 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man walking: medium skin tone # 8.0 [1] (🚶🏽♂️)
+1F6B6 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman walking: medium-dark skin tone # 8.0 [1] (🚶🏾♀️)
+1F6B6 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man walking: medium-dark skin tone # 8.0 [1] (🚶🏾♂️)
+1F6B6 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman walking: dark skin tone # 8.0 [1] (🚶🏿♀️)
+1F6B6 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man walking: dark skin tone # 8.0 [1] (🚶🏿♂️)
+1F926 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman facepalming # 9.0 [1] (🤦♀️)
+1F926 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man facepalming # 9.0 [1] (🤦♂️)
+1F926 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman facepalming: light skin tone # 9.0 [1] (🤦🏻♀️)
+1F926 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man facepalming: light skin tone # 9.0 [1] (🤦🏻♂️)
+1F926 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman facepalming: medium-light skin tone # 9.0 [1] (🤦🏼♀️)
+1F926 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man facepalming: medium-light skin tone # 9.0 [1] (🤦🏼♂️)
+1F926 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman facepalming: medium skin tone # 9.0 [1] (🤦🏽♀️)
+1F926 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man facepalming: medium skin tone # 9.0 [1] (🤦🏽♂️)
+1F926 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman facepalming: medium-dark skin tone # 9.0 [1] (🤦🏾♀️)
+1F926 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man facepalming: medium-dark skin tone # 9.0 [1] (🤦🏾♂️)
+1F926 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman facepalming: dark skin tone # 9.0 [1] (🤦🏿♀️)
+1F926 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man facepalming: dark skin tone # 9.0 [1] (🤦🏿♂️)
+1F937 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman shrugging # 9.0 [1] (🤷♀️)
+1F937 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man shrugging # 9.0 [1] (🤷♂️)
+1F937 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman shrugging: light skin tone # 9.0 [1] (🤷🏻♀️)
+1F937 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man shrugging: light skin tone # 9.0 [1] (🤷🏻♂️)
+1F937 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman shrugging: medium-light skin tone # 9.0 [1] (🤷🏼♀️)
+1F937 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man shrugging: medium-light skin tone # 9.0 [1] (🤷🏼♂️)
+1F937 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman shrugging: medium skin tone # 9.0 [1] (🤷🏽♀️)
+1F937 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man shrugging: medium skin tone # 9.0 [1] (🤷🏽♂️)
+1F937 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman shrugging: medium-dark skin tone # 9.0 [1] (🤷🏾♀️)
+1F937 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man shrugging: medium-dark skin tone # 9.0 [1] (🤷🏾♂️)
+1F937 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman shrugging: dark skin tone # 9.0 [1] (🤷🏿♀️)
+1F937 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man shrugging: dark skin tone # 9.0 [1] (🤷🏿♂️)
+1F938 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman cartwheeling # 9.0 [1] (🤸♀️)
+1F938 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man cartwheeling # 9.0 [1] (🤸♂️)
+1F938 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman cartwheeling: light skin tone # 9.0 [1] (🤸🏻♀️)
+1F938 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man cartwheeling: light skin tone # 9.0 [1] (🤸🏻♂️)
+1F938 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman cartwheeling: medium-light skin tone # 9.0 [1] (🤸🏼♀️)
+1F938 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man cartwheeling: medium-light skin tone # 9.0 [1] (🤸🏼♂️)
+1F938 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman cartwheeling: medium skin tone # 9.0 [1] (🤸🏽♀️)
+1F938 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man cartwheeling: medium skin tone # 9.0 [1] (🤸🏽♂️)
+1F938 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman cartwheeling: medium-dark skin tone # 9.0 [1] (🤸🏾♀️)
+1F938 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man cartwheeling: medium-dark skin tone # 9.0 [1] (🤸🏾♂️)
+1F938 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman cartwheeling: dark skin tone # 9.0 [1] (🤸🏿♀️)
+1F938 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man cartwheeling: dark skin tone # 9.0 [1] (🤸🏿♂️)
+1F939 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman juggling # 9.0 [1] (🤹♀️)
+1F939 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man juggling # 9.0 [1] (🤹♂️)
+1F939 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman juggling: light skin tone # 9.0 [1] (🤹🏻♀️)
+1F939 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man juggling: light skin tone # 9.0 [1] (🤹🏻♂️)
+1F939 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman juggling: medium-light skin tone # 9.0 [1] (🤹🏼♀️)
+1F939 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man juggling: medium-light skin tone # 9.0 [1] (🤹🏼♂️)
+1F939 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman juggling: medium skin tone # 9.0 [1] (🤹🏽♀️)
+1F939 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man juggling: medium skin tone # 9.0 [1] (🤹🏽♂️)
+1F939 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman juggling: medium-dark skin tone # 9.0 [1] (🤹🏾♀️)
+1F939 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man juggling: medium-dark skin tone # 9.0 [1] (🤹🏾♂️)
+1F939 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman juggling: dark skin tone # 9.0 [1] (🤹🏿♀️)
+1F939 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man juggling: dark skin tone # 9.0 [1] (🤹🏿♂️)
+1F93C 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; women wrestling # 9.0 [1] (🤼♀️)
+1F93C 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; men wrestling # 9.0 [1] (🤼♂️)
+1F93D 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing water polo # 9.0 [1] (🤽♀️)
+1F93D 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing water polo # 9.0 [1] (🤽♂️)
+1F93D 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing water polo: light skin tone # 9.0 [1] (🤽🏻♀️)
+1F93D 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing water polo: light skin tone # 9.0 [1] (🤽🏻♂️)
+1F93D 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing water polo: medium-light skin tone # 9.0 [1] (🤽🏼♀️)
+1F93D 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing water polo: medium-light skin tone # 9.0 [1] (🤽🏼♂️)
+1F93D 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing water polo: medium skin tone # 9.0 [1] (🤽🏽♀️)
+1F93D 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing water polo: medium skin tone # 9.0 [1] (🤽🏽♂️)
+1F93D 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing water polo: medium-dark skin tone # 9.0 [1] (🤽🏾♀️)
+1F93D 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing water polo: medium-dark skin tone # 9.0 [1] (🤽🏾♂️)
+1F93D 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing water polo: dark skin tone # 9.0 [1] (🤽🏿♀️)
+1F93D 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing water polo: dark skin tone # 9.0 [1] (🤽🏿♂️)
+1F93E 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing handball # 9.0 [1] (🤾♀️)
+1F93E 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing handball # 9.0 [1] (🤾♂️)
+1F93E 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing handball: light skin tone # 9.0 [1] (🤾🏻♀️)
+1F93E 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing handball: light skin tone # 9.0 [1] (🤾🏻♂️)
+1F93E 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing handball: medium-light skin tone # 9.0 [1] (🤾🏼♀️)
+1F93E 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing handball: medium-light skin tone # 9.0 [1] (🤾🏼♂️)
+1F93E 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing handball: medium skin tone # 9.0 [1] (🤾🏽♀️)
+1F93E 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing handball: medium skin tone # 9.0 [1] (🤾🏽♂️)
+1F93E 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing handball: medium-dark skin tone # 9.0 [1] (🤾🏾♀️)
+1F93E 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing handball: medium-dark skin tone # 9.0 [1] (🤾🏾♂️)
+1F93E 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman playing handball: dark skin tone # 9.0 [1] (🤾🏿♀️)
+1F93E 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man playing handball: dark skin tone # 9.0 [1] (🤾🏿♂️)
+1F9B8 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman superhero # 11.0 [1] (🦸♀️)
+1F9B8 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man superhero # 11.0 [1] (🦸♂️)
+1F9B8 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman superhero: light skin tone # 11.0 [1] (🦸🏻♀️)
+1F9B8 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man superhero: light skin tone # 11.0 [1] (🦸🏻♂️)
+1F9B8 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman superhero: medium-light skin tone # 11.0 [1] (🦸🏼♀️)
+1F9B8 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man superhero: medium-light skin tone # 11.0 [1] (🦸🏼♂️)
+1F9B8 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman superhero: medium skin tone # 11.0 [1] (🦸🏽♀️)
+1F9B8 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man superhero: medium skin tone # 11.0 [1] (🦸🏽♂️)
+1F9B8 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman superhero: medium-dark skin tone # 11.0 [1] (🦸🏾♀️)
+1F9B8 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man superhero: medium-dark skin tone # 11.0 [1] (🦸🏾♂️)
+1F9B8 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman superhero: dark skin tone # 11.0 [1] (🦸🏿♀️)
+1F9B8 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man superhero: dark skin tone # 11.0 [1] (🦸🏿♂️)
+1F9B9 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman supervillain # 11.0 [1] (🦹♀️)
+1F9B9 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man supervillain # 11.0 [1] (🦹♂️)
+1F9B9 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman supervillain: light skin tone # 11.0 [1] (🦹🏻♀️)
+1F9B9 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man supervillain: light skin tone # 11.0 [1] (🦹🏻♂️)
+1F9B9 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman supervillain: medium-light skin tone # 11.0 [1] (🦹🏼♀️)
+1F9B9 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man supervillain: medium-light skin tone # 11.0 [1] (🦹🏼♂️)
+1F9B9 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman supervillain: medium skin tone # 11.0 [1] (🦹🏽♀️)
+1F9B9 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man supervillain: medium skin tone # 11.0 [1] (🦹🏽♂️)
+1F9B9 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman supervillain: medium-dark skin tone # 11.0 [1] (🦹🏾♀️)
+1F9B9 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man supervillain: medium-dark skin tone # 11.0 [1] (🦹🏾♂️)
+1F9B9 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman supervillain: dark skin tone # 11.0 [1] (🦹🏿♀️)
+1F9B9 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man supervillain: dark skin tone # 11.0 [1] (🦹🏿♂️)
+1F9CD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman standing # 12.0 [1] (🧍♀️)
+1F9CD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man standing # 12.0 [1] (🧍♂️)
+1F9CD 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman standing: light skin tone # 12.0 [1] (🧍🏻♀️)
+1F9CD 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man standing: light skin tone # 12.0 [1] (🧍🏻♂️)
+1F9CD 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman standing: medium-light skin tone # 12.0 [1] (🧍🏼♀️)
+1F9CD 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man standing: medium-light skin tone # 12.0 [1] (🧍🏼♂️)
+1F9CD 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman standing: medium skin tone # 12.0 [1] (🧍🏽♀️)
+1F9CD 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man standing: medium skin tone # 12.0 [1] (🧍🏽♂️)
+1F9CD 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman standing: medium-dark skin tone # 12.0 [1] (🧍🏾♀️)
+1F9CD 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man standing: medium-dark skin tone # 12.0 [1] (🧍🏾♂️)
+1F9CD 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman standing: dark skin tone # 12.0 [1] (🧍🏿♀️)
+1F9CD 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man standing: dark skin tone # 12.0 [1] (🧍🏿♂️)
+1F9CE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman kneeling # 12.0 [1] (🧎♀️)
+1F9CE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man kneeling # 12.0 [1] (🧎♂️)
+1F9CE 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman kneeling: light skin tone # 12.0 [1] (🧎🏻♀️)
+1F9CE 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man kneeling: light skin tone # 12.0 [1] (🧎🏻♂️)
+1F9CE 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman kneeling: medium-light skin tone # 12.0 [1] (🧎🏼♀️)
+1F9CE 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man kneeling: medium-light skin tone # 12.0 [1] (🧎🏼♂️)
+1F9CE 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman kneeling: medium skin tone # 12.0 [1] (🧎🏽♀️)
+1F9CE 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man kneeling: medium skin tone # 12.0 [1] (🧎🏽♂️)
+1F9CE 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman kneeling: medium-dark skin tone # 12.0 [1] (🧎🏾♀️)
+1F9CE 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man kneeling: medium-dark skin tone # 12.0 [1] (🧎🏾♂️)
+1F9CE 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman kneeling: dark skin tone # 12.0 [1] (🧎🏿♀️)
+1F9CE 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man kneeling: dark skin tone # 12.0 [1] (🧎🏿♂️)
+1F9CF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; deaf woman # 12.0 [1] (🧏♀️)
+1F9CF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; deaf man # 12.0 [1] (🧏♂️)
+1F9CF 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; deaf woman: light skin tone # 12.0 [1] (🧏🏻♀️)
+1F9CF 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; deaf man: light skin tone # 12.0 [1] (🧏🏻♂️)
+1F9CF 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; deaf woman: medium-light skin tone # 12.0 [1] (🧏🏼♀️)
+1F9CF 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; deaf man: medium-light skin tone # 12.0 [1] (🧏🏼♂️)
+1F9CF 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; deaf woman: medium skin tone # 12.0 [1] (🧏🏽♀️)
+1F9CF 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; deaf man: medium skin tone # 12.0 [1] (🧏🏽♂️)
+1F9CF 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; deaf woman: medium-dark skin tone # 12.0 [1] (🧏🏾♀️)
+1F9CF 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; deaf man: medium-dark skin tone # 12.0 [1] (🧏🏾♂️)
+1F9CF 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; deaf woman: dark skin tone # 12.0 [1] (🧏🏿♀️)
+1F9CF 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; deaf man: dark skin tone # 12.0 [1] (🧏🏿♂️)
+1F9D6 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in steamy room # 10.0 [1] (🧖♀️)
+1F9D6 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in steamy room # 10.0 [1] (🧖♂️)
+1F9D6 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in steamy room: light skin tone # 10.0 [1] (🧖🏻♀️)
+1F9D6 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in steamy room: light skin tone # 10.0 [1] (🧖🏻♂️)
+1F9D6 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in steamy room: medium-light skin tone # 10.0 [1] (🧖🏼♀️)
+1F9D6 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in steamy room: medium-light skin tone # 10.0 [1] (🧖🏼♂️)
+1F9D6 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in steamy room: medium skin tone # 10.0 [1] (🧖🏽♀️)
+1F9D6 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in steamy room: medium skin tone # 10.0 [1] (🧖🏽♂️)
+1F9D6 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in steamy room: medium-dark skin tone # 10.0 [1] (🧖🏾♀️)
+1F9D6 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in steamy room: medium-dark skin tone # 10.0 [1] (🧖🏾♂️)
+1F9D6 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in steamy room: dark skin tone # 10.0 [1] (🧖🏿♀️)
+1F9D6 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in steamy room: dark skin tone # 10.0 [1] (🧖🏿♂️)
+1F9D7 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman climbing # 10.0 [1] (🧗♀️)
+1F9D7 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man climbing # 10.0 [1] (🧗♂️)
+1F9D7 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman climbing: light skin tone # 10.0 [1] (🧗🏻♀️)
+1F9D7 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man climbing: light skin tone # 10.0 [1] (🧗🏻♂️)
+1F9D7 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman climbing: medium-light skin tone # 10.0 [1] (🧗🏼♀️)
+1F9D7 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man climbing: medium-light skin tone # 10.0 [1] (🧗🏼♂️)
+1F9D7 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman climbing: medium skin tone # 10.0 [1] (🧗🏽♀️)
+1F9D7 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man climbing: medium skin tone # 10.0 [1] (🧗🏽♂️)
+1F9D7 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman climbing: medium-dark skin tone # 10.0 [1] (🧗🏾♀️)
+1F9D7 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man climbing: medium-dark skin tone # 10.0 [1] (🧗🏾♂️)
+1F9D7 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman climbing: dark skin tone # 10.0 [1] (🧗🏿♀️)
+1F9D7 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man climbing: dark skin tone # 10.0 [1] (🧗🏿♂️)
+1F9D8 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in lotus position # 10.0 [1] (🧘♀️)
+1F9D8 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in lotus position # 10.0 [1] (🧘♂️)
+1F9D8 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in lotus position: light skin tone # 10.0 [1] (🧘🏻♀️)
+1F9D8 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in lotus position: light skin tone # 10.0 [1] (🧘🏻♂️)
+1F9D8 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in lotus position: medium-light skin tone # 10.0 [1] (🧘🏼♀️)
+1F9D8 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in lotus position: medium-light skin tone # 10.0 [1] (🧘🏼♂️)
+1F9D8 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in lotus position: medium skin tone # 10.0 [1] (🧘🏽♀️)
+1F9D8 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in lotus position: medium skin tone # 10.0 [1] (🧘🏽♂️)
+1F9D8 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in lotus position: medium-dark skin tone # 10.0 [1] (🧘🏾♀️)
+1F9D8 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in lotus position: medium-dark skin tone # 10.0 [1] (🧘🏾♂️)
+1F9D8 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman in lotus position: dark skin tone # 10.0 [1] (🧘🏿♀️)
+1F9D8 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man in lotus position: dark skin tone # 10.0 [1] (🧘🏿♂️)
+1F9D9 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mage # 10.0 [1] (🧙♀️)
+1F9D9 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mage # 10.0 [1] (🧙♂️)
+1F9D9 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mage: light skin tone # 10.0 [1] (🧙🏻♀️)
+1F9D9 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mage: light skin tone # 10.0 [1] (🧙🏻♂️)
+1F9D9 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mage: medium-light skin tone # 10.0 [1] (🧙🏼♀️)
+1F9D9 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mage: medium-light skin tone # 10.0 [1] (🧙🏼♂️)
+1F9D9 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mage: medium skin tone # 10.0 [1] (🧙🏽♀️)
+1F9D9 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mage: medium skin tone # 10.0 [1] (🧙🏽♂️)
+1F9D9 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mage: medium-dark skin tone # 10.0 [1] (🧙🏾♀️)
+1F9D9 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mage: medium-dark skin tone # 10.0 [1] (🧙🏾♂️)
+1F9D9 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman mage: dark skin tone # 10.0 [1] (🧙🏿♀️)
+1F9D9 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man mage: dark skin tone # 10.0 [1] (🧙🏿♂️)
+1F9DA 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman fairy # 10.0 [1] (🧚♀️)
+1F9DA 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man fairy # 10.0 [1] (🧚♂️)
+1F9DA 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman fairy: light skin tone # 10.0 [1] (🧚🏻♀️)
+1F9DA 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man fairy: light skin tone # 10.0 [1] (🧚🏻♂️)
+1F9DA 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman fairy: medium-light skin tone # 10.0 [1] (🧚🏼♀️)
+1F9DA 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man fairy: medium-light skin tone # 10.0 [1] (🧚🏼♂️)
+1F9DA 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman fairy: medium skin tone # 10.0 [1] (🧚🏽♀️)
+1F9DA 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man fairy: medium skin tone # 10.0 [1] (🧚🏽♂️)
+1F9DA 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman fairy: medium-dark skin tone # 10.0 [1] (🧚🏾♀️)
+1F9DA 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man fairy: medium-dark skin tone # 10.0 [1] (🧚🏾♂️)
+1F9DA 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman fairy: dark skin tone # 10.0 [1] (🧚🏿♀️)
+1F9DA 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man fairy: dark skin tone # 10.0 [1] (🧚🏿♂️)
+1F9DB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman vampire # 10.0 [1] (🧛♀️)
+1F9DB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man vampire # 10.0 [1] (🧛♂️)
+1F9DB 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman vampire: light skin tone # 10.0 [1] (🧛🏻♀️)
+1F9DB 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man vampire: light skin tone # 10.0 [1] (🧛🏻♂️)
+1F9DB 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman vampire: medium-light skin tone # 10.0 [1] (🧛🏼♀️)
+1F9DB 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man vampire: medium-light skin tone # 10.0 [1] (🧛🏼♂️)
+1F9DB 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman vampire: medium skin tone # 10.0 [1] (🧛🏽♀️)
+1F9DB 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man vampire: medium skin tone # 10.0 [1] (🧛🏽♂️)
+1F9DB 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman vampire: medium-dark skin tone # 10.0 [1] (🧛🏾♀️)
+1F9DB 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man vampire: medium-dark skin tone # 10.0 [1] (🧛🏾♂️)
+1F9DB 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman vampire: dark skin tone # 10.0 [1] (🧛🏿♀️)
+1F9DB 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man vampire: dark skin tone # 10.0 [1] (🧛🏿♂️)
+1F9DC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; mermaid # 10.0 [1] (🧜♀️)
+1F9DC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; merman # 10.0 [1] (🧜♂️)
+1F9DC 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; mermaid: light skin tone # 10.0 [1] (🧜🏻♀️)
+1F9DC 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; merman: light skin tone # 10.0 [1] (🧜🏻♂️)
+1F9DC 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; mermaid: medium-light skin tone # 10.0 [1] (🧜🏼♀️)
+1F9DC 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; merman: medium-light skin tone # 10.0 [1] (🧜🏼♂️)
+1F9DC 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; mermaid: medium skin tone # 10.0 [1] (🧜🏽♀️)
+1F9DC 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; merman: medium skin tone # 10.0 [1] (🧜🏽♂️)
+1F9DC 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; mermaid: medium-dark skin tone # 10.0 [1] (🧜🏾♀️)
+1F9DC 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; merman: medium-dark skin tone # 10.0 [1] (🧜🏾♂️)
+1F9DC 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; mermaid: dark skin tone # 10.0 [1] (🧜🏿♀️)
+1F9DC 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; merman: dark skin tone # 10.0 [1] (🧜🏿♂️)
+1F9DD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman elf # 10.0 [1] (🧝♀️)
+1F9DD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man elf # 10.0 [1] (🧝♂️)
+1F9DD 1F3FB 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman elf: light skin tone # 10.0 [1] (🧝🏻♀️)
+1F9DD 1F3FB 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man elf: light skin tone # 10.0 [1] (🧝🏻♂️)
+1F9DD 1F3FC 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman elf: medium-light skin tone # 10.0 [1] (🧝🏼♀️)
+1F9DD 1F3FC 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man elf: medium-light skin tone # 10.0 [1] (🧝🏼♂️)
+1F9DD 1F3FD 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman elf: medium skin tone # 10.0 [1] (🧝🏽♀️)
+1F9DD 1F3FD 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man elf: medium skin tone # 10.0 [1] (🧝🏽♂️)
+1F9DD 1F3FE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman elf: medium-dark skin tone # 10.0 [1] (🧝🏾♀️)
+1F9DD 1F3FE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man elf: medium-dark skin tone # 10.0 [1] (🧝🏾♂️)
+1F9DD 1F3FF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman elf: dark skin tone # 10.0 [1] (🧝🏿♀️)
+1F9DD 1F3FF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man elf: dark skin tone # 10.0 [1] (🧝🏿♂️)
+1F9DE 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman genie # 10.0 [1] (🧞♀️)
+1F9DE 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man genie # 10.0 [1] (🧞♂️)
+1F9DF 200D 2640 FE0F ; Emoji_ZWJ_Sequence ; woman zombie # 10.0 [1] (🧟♀️)
+1F9DF 200D 2642 FE0F ; Emoji_ZWJ_Sequence ; man zombie # 10.0 [1] (🧟♂️)
+
+# Total elements: 536
+
+# ================================================
+
+# Emoji_ZWJ_Sequence: Hair
+
+1F468 200D 1F9B0 ; Emoji_ZWJ_Sequence ; man: red hair # 11.0 [1] (👨🦰)
+1F468 200D 1F9B1 ; Emoji_ZWJ_Sequence ; man: curly hair # 11.0 [1] (👨🦱)
+1F468 200D 1F9B2 ; Emoji_ZWJ_Sequence ; man: bald # 11.0 [1] (👨🦲)
+1F468 200D 1F9B3 ; Emoji_ZWJ_Sequence ; man: white hair # 11.0 [1] (👨🦳)
+1F468 1F3FB 200D 1F9B0 ; Emoji_ZWJ_Sequence ; man: light skin tone, red hair # 11.0 [1] (👨🏻🦰)
+1F468 1F3FB 200D 1F9B1 ; Emoji_ZWJ_Sequence ; man: light skin tone, curly hair # 11.0 [1] (👨🏻🦱)
+1F468 1F3FB 200D 1F9B2 ; Emoji_ZWJ_Sequence ; man: light skin tone, bald # 11.0 [1] (👨🏻🦲)
+1F468 1F3FB 200D 1F9B3 ; Emoji_ZWJ_Sequence ; man: light skin tone, white hair # 11.0 [1] (👨🏻🦳)
+1F468 1F3FC 200D 1F9B0 ; Emoji_ZWJ_Sequence ; man: medium-light skin tone, red hair # 11.0 [1] (👨🏼🦰)
+1F468 1F3FC 200D 1F9B1 ; Emoji_ZWJ_Sequence ; man: medium-light skin tone, curly hair # 11.0 [1] (👨🏼🦱)
+1F468 1F3FC 200D 1F9B2 ; Emoji_ZWJ_Sequence ; man: medium-light skin tone, bald # 11.0 [1] (👨🏼🦲)
+1F468 1F3FC 200D 1F9B3 ; Emoji_ZWJ_Sequence ; man: medium-light skin tone, white hair # 11.0 [1] (👨🏼🦳)
+1F468 1F3FD 200D 1F9B0 ; Emoji_ZWJ_Sequence ; man: medium skin tone, red hair # 11.0 [1] (👨🏽🦰)
+1F468 1F3FD 200D 1F9B1 ; Emoji_ZWJ_Sequence ; man: medium skin tone, curly hair # 11.0 [1] (👨🏽🦱)
+1F468 1F3FD 200D 1F9B2 ; Emoji_ZWJ_Sequence ; man: medium skin tone, bald # 11.0 [1] (👨🏽🦲)
+1F468 1F3FD 200D 1F9B3 ; Emoji_ZWJ_Sequence ; man: medium skin tone, white hair # 11.0 [1] (👨🏽🦳)
+1F468 1F3FE 200D 1F9B0 ; Emoji_ZWJ_Sequence ; man: medium-dark skin tone, red hair # 11.0 [1] (👨🏾🦰)
+1F468 1F3FE 200D 1F9B1 ; Emoji_ZWJ_Sequence ; man: medium-dark skin tone, curly hair # 11.0 [1] (👨🏾🦱)
+1F468 1F3FE 200D 1F9B2 ; Emoji_ZWJ_Sequence ; man: medium-dark skin tone, bald # 11.0 [1] (👨🏾🦲)
+1F468 1F3FE 200D 1F9B3 ; Emoji_ZWJ_Sequence ; man: medium-dark skin tone, white hair # 11.0 [1] (👨🏾🦳)
+1F468 1F3FF 200D 1F9B0 ; Emoji_ZWJ_Sequence ; man: dark skin tone, red hair # 11.0 [1] (👨🏿🦰)
+1F468 1F3FF 200D 1F9B1 ; Emoji_ZWJ_Sequence ; man: dark skin tone, curly hair # 11.0 [1] (👨🏿🦱)
+1F468 1F3FF 200D 1F9B2 ; Emoji_ZWJ_Sequence ; man: dark skin tone, bald # 11.0 [1] (👨🏿🦲)
+1F468 1F3FF 200D 1F9B3 ; Emoji_ZWJ_Sequence ; man: dark skin tone, white hair # 11.0 [1] (👨🏿🦳)
+1F469 200D 1F9B0 ; Emoji_ZWJ_Sequence ; woman: red hair # 11.0 [1] (👩🦰)
+1F469 200D 1F9B1 ; Emoji_ZWJ_Sequence ; woman: curly hair # 11.0 [1] (👩🦱)
+1F469 200D 1F9B2 ; Emoji_ZWJ_Sequence ; woman: bald # 11.0 [1] (👩🦲)
+1F469 200D 1F9B3 ; Emoji_ZWJ_Sequence ; woman: white hair # 11.0 [1] (👩🦳)
+1F469 1F3FB 200D 1F9B0 ; Emoji_ZWJ_Sequence ; woman: light skin tone, red hair # 11.0 [1] (👩🏻🦰)
+1F469 1F3FB 200D 1F9B1 ; Emoji_ZWJ_Sequence ; woman: light skin tone, curly hair # 11.0 [1] (👩🏻🦱)
+1F469 1F3FB 200D 1F9B2 ; Emoji_ZWJ_Sequence ; woman: light skin tone, bald # 11.0 [1] (👩🏻🦲)
+1F469 1F3FB 200D 1F9B3 ; Emoji_ZWJ_Sequence ; woman: light skin tone, white hair # 11.0 [1] (👩🏻🦳)
+1F469 1F3FC 200D 1F9B0 ; Emoji_ZWJ_Sequence ; woman: medium-light skin tone, red hair # 11.0 [1] (👩🏼🦰)
+1F469 1F3FC 200D 1F9B1 ; Emoji_ZWJ_Sequence ; woman: medium-light skin tone, curly hair # 11.0 [1] (👩🏼🦱)
+1F469 1F3FC 200D 1F9B2 ; Emoji_ZWJ_Sequence ; woman: medium-light skin tone, bald # 11.0 [1] (👩🏼🦲)
+1F469 1F3FC 200D 1F9B3 ; Emoji_ZWJ_Sequence ; woman: medium-light skin tone, white hair # 11.0 [1] (👩🏼🦳)
+1F469 1F3FD 200D 1F9B0 ; Emoji_ZWJ_Sequence ; woman: medium skin tone, red hair # 11.0 [1] (👩🏽🦰)
+1F469 1F3FD 200D 1F9B1 ; Emoji_ZWJ_Sequence ; woman: medium skin tone, curly hair # 11.0 [1] (👩🏽🦱)
+1F469 1F3FD 200D 1F9B2 ; Emoji_ZWJ_Sequence ; woman: medium skin tone, bald # 11.0 [1] (👩🏽🦲)
+1F469 1F3FD 200D 1F9B3 ; Emoji_ZWJ_Sequence ; woman: medium skin tone, white hair # 11.0 [1] (👩🏽🦳)
+1F469 1F3FE 200D 1F9B0 ; Emoji_ZWJ_Sequence ; woman: medium-dark skin tone, red hair # 11.0 [1] (👩🏾🦰)
+1F469 1F3FE 200D 1F9B1 ; Emoji_ZWJ_Sequence ; woman: medium-dark skin tone, curly hair # 11.0 [1] (👩🏾🦱)
+1F469 1F3FE 200D 1F9B2 ; Emoji_ZWJ_Sequence ; woman: medium-dark skin tone, bald # 11.0 [1] (👩🏾🦲)
+1F469 1F3FE 200D 1F9B3 ; Emoji_ZWJ_Sequence ; woman: medium-dark skin tone, white hair # 11.0 [1] (👩🏾🦳)
+1F469 1F3FF 200D 1F9B0 ; Emoji_ZWJ_Sequence ; woman: dark skin tone, red hair # 11.0 [1] (👩🏿🦰)
+1F469 1F3FF 200D 1F9B1 ; Emoji_ZWJ_Sequence ; woman: dark skin tone, curly hair # 11.0 [1] (👩🏿🦱)
+1F469 1F3FF 200D 1F9B2 ; Emoji_ZWJ_Sequence ; woman: dark skin tone, bald # 11.0 [1] (👩🏿🦲)
+1F469 1F3FF 200D 1F9B3 ; Emoji_ZWJ_Sequence ; woman: dark skin tone, white hair # 11.0 [1] (👩🏿🦳)
+
+# Total elements: 48
+
+# ================================================
+
+# Emoji_ZWJ_Sequence: Other
+
+1F3F3 FE0F 200D 1F308 ; Emoji_ZWJ_Sequence ; rainbow flag # 7.0 [1] (🏳️🌈)
+1F3F4 200D 2620 FE0F ; Emoji_ZWJ_Sequence ; pirate flag # 7.0 [1] (🏴☠️)
+1F415 200D 1F9BA ; Emoji_ZWJ_Sequence ; service dog # 12.0 [1] (🐕🦺)
+1F441 FE0F 200D 1F5E8 FE0F ; Emoji_ZWJ_Sequence ; eye in speech bubble # 7.0 [1] (👁️🗨️)
+
+# Total elements: 4
+
+#EOF
diff --git a/admin/unidata/emoji-zwj.awk b/admin/unidata/emoji-zwj.awk
new file mode 100644
index 0000000000..f6854726cf
--- /dev/null
+++ b/admin/unidata/emoji-zwj.awk
@@ -0,0 +1,102 @@
+#!/usr/bin/awk -f
+
+## Copyright (C) 2020 Free Software Foundation, Inc.
+
+## Author: Robert Pluim <rpluim@gmail.com>
+
+## This file is part of GNU Emacs.
+
+## GNU Emacs is free software: you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+
+## GNU Emacs is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+
+## You should have received a copy of the GNU General Public License
+## along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
+### Commentary:
+
+## This script takes as input Unicode's emoji-zwj-sequences.txt
+## (https://www.unicode.org/Public/emoji/12.0/emoji-zwj-sequences.txt)
+## and produces output for Emacs's lisp/international/emoji-zwj.el.
+
+## For additional details, see <https://debbugs.gnu.org/39799#8>.
+
+## Things to do after installing a new version of emoji-zwj-sequences.txt:
+## Check the output against the old output.
+## Rebuild emacs, visit emoji-zwj-sequences.txt and check that the
+## various sequences are being composed properly. Don't forget to
+## install an appropriate font, such as Noto Color Emoji or Symbola.
+
+### Code:
+
+/^[0-9A-F]/ {
+ sub(/ *;.*/, "", $0)
+ num = split($0, elts)
+ if (ch[elts[1]] == "")
+ {
+ vec[elts[1]] = ""
+ ch[elts[1]] = elts[1]
+ }
+ else
+ {
+ vec[elts[1]] = vec[elts[1]] "\n"
+ }
+ vec[elts[1]] = vec[elts[1]] "\""
+ for (j = 1; j <= num; j++)
+ {
+ c = sprintf("\\N{U+%s}", elts[j])
+ vec[elts[1]] = vec[elts[1]] c
+ }
+ vec[elts[1]] = vec[elts[1]] "\""
+}
+
+END {
+ print ";;; emoji-zwj.el --- emoji zwj character composition table"
+ print ";;; Automatically generated from admin/unidata/emoji-zwj-sequences.txt"
+ print "(eval-when-compile (require 'regexp-opt))"
+ print "(dolist (elt `("
+
+ for (elt in ch)
+ {
+ printf("(#x%s .\n,(eval-when-compile (regexp-opt\n'(\n%s\n))))\n", elt, vec[elt])
+ }
+ print "))"
+ print " (set-char-table-range composition-function-table"
+ print " (car elt)"
+ print " (nconc (char-table-range composition-function-table (car elt))"
+ print " (list (vector (cdr elt)"
+ print " 0"
+ print " 'compose-gstring-for-graphic)))))"
+ print "\n"
+ print "(provide 'emoji-zwj)"
+}
+
+# ;; Flags
+# (set-char-table-range composition-function-table
+# '(#x1f1e6 . #x1f1ff)
+# (nconc (char-table-range composition-function-table '(#x1f1e6 . #x1f1ff)
+# (list (vector "[\U0001f1e6-\U0001f1ff][\U0001f1e6-\U0001f1ff]"
+# 0
+# 'compose-gstring-for-graphic)))))
+
+# ;; UK Flags
+# (set-char-table-range composition-function-table
+# #x1f3f4
+# (nconc (char-table-range composition-function-table #x1f3f4)
+# (list (vector "\U0001F3F4\U000E0067\U000E0062\\(?:\U000E0065\U000E006E\U000E0067\\|\U000E0073\U000E0063\U000E0074\\|\U000E0077\U000E006C\U000E0073\\)\U000E007F"
+# 0
+# 'compose-gstring-for-graphic))))
+
+# ;; Skin tones
+# (set-char-table-range composition-function-table
+# '(#x1f3fb . #x1f3ff)
+# (nconc (char-table-range composition-function-table ('#x1f3fb . #x1f3ff))
+# (list (vector ".[\U0001f3fb-\U0001f3ff]"
+# 1
+# 'compose-gstring-for-graphic))))
diff --git a/etc/NEWS b/etc/NEWS
index 79bae1bbc3..e39cc42482 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -74,6 +74,12 @@ dimension.
If it is non-nil it attempts to set the source address for a datagram
process rather than the destination address.
+** Emoji Zero Width Join (ZWJ) sequences are now composed.
+Emacs can now compose all the Unicode-12 ZWJ Emoji sequences (if a
+suitable font is installed) so that they are displayed as single
+glyphs instead of multiple ones. 'Noto Color Emoji' is one such
+suitable font.
+
\f
* Editing Changes in Emacs 28.1
diff --git a/lisp/international/characters.el b/lisp/international/characters.el
index e7f8662323..628ce79072 100644
--- a/lisp/international/characters.el
+++ b/lisp/international/characters.el
@@ -1345,8 +1345,12 @@ use-default-char-width-table
(if dump-mode
;; While dumping, we can't use require, and international is not
;; in load-path.
- (load "international/charscript")
- (require 'charscript))
+ (progn
+ (load "international/charscript")
+ (load "international/emoji-zwj"))
+ (progn
+ (require 'charscript)
+ (require 'emoji-zwj)))
(map-charset-chars
#'(lambda (range _ignore)
diff --git a/src/Makefile.in b/src/Makefile.in
index 552dd2e50a..4c2b9c24b6 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -559,7 +559,11 @@ charscript =
${charscript}: FORCE
$(MAKE) -C ../admin/unidata $(notdir $@)
-${lispintdir}/characters.elc: ${charscript:.el=.elc}
+emoji-zwj = ${lispintdir}/emoji-zwj.el
+${emoji-zwj}: FORCE
+ $(MAKE) -C ../admin/unidata $(notdir $@)
+
+${lispintdir}/characters.elc: ${charscript:.el=.elc} ${emoji-zwj:.el=.elc}
## The dumped Emacs is as functional and more efficient than
## bootstrap-emacs, so we replace the latter with the former.
@@ -647,7 +651,7 @@ $(LIBEGNU_ARCHIVE):
## This goes on to affect various things, and the emacs binary fails
## to start if Vinstallation_directory has the wrong value.
temacs$(EXEEXT): $(LIBXMENU) $(ALLOBJS) $(LIBEGNU_ARCHIVE) $(EMACSRES) \
- $(charsets) $(charscript) $(MAKE_PDUMPER_FINGERPRINT)
+ $(charsets) $(charscript) ${emoji-zwj} $(MAKE_PDUMPER_FINGERPRINT)
$(AM_V_CCLD)$(CC) -o $@.tmp \
$(ALL_CFLAGS) $(TEMACS_LDFLAGS) $(LDFLAGS) \
$(ALLOBJS) $(LIBEGNU_ARCHIVE) $(W32_RES_LINK) $(LIBES)
--
2.25.0.232.gd8437c57fa
^ permalink raw reply related [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 20:12 ` Robert Pluim
@ 2020-03-02 20:21 ` Eli Zaretskii
2020-03-02 20:55 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-02 20:21 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org
> Date: Mon, 02 Mar 2020 21:12:39 +0100
>
> Stefan> Try and make sure that regexp-opt is only used during compilation,
> Stefan> e.g. by wrapping it inside an `eval-when-compile`.
>
> Thanks for that, itʼs working now.
>
> Latest version attached.
Thanks. Please also update admin/notes/unicode with the information
about importing the additional file from Unicode.
Also, what about the sequences in other emoji-*.txt files? Or are
they already covered?
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 20:21 ` Eli Zaretskii
@ 2020-03-02 20:55 ` Robert Pluim
2020-03-03 12:51 ` Robert Pluim
2020-03-03 17:22 ` Eli Zaretskii
0 siblings, 2 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-02 20:55 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Mon, 02 Mar 2020 22:21:18 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Cc: Eli Zaretskii <eliz@gnu.org>, emacs-devel@gnu.org
>> Date: Mon, 02 Mar 2020 21:12:39 +0100
>>
Stefan> Try and make sure that regexp-opt is only used during compilation,
Stefan> e.g. by wrapping it inside an `eval-when-compile`.
>>
>> Thanks for that, itʼs working now.
>>
>> Latest version attached.
Eli> Thanks. Please also update admin/notes/unicode with the information
Eli> about importing the additional file from Unicode.
OK.
Eli> Also, what about the sequences in other emoji-*.txt files? Or are
Eli> they already covered?
What Iʼve extracted from emoji-sequences.txt is in the comments at the
end of emoji-zwj.awk, we can just add that to the output if you agree.
I donʼt think we can support the Keycaps emoji, since the base
characters are ASCII.
One thing we could do with emoji-data.txt is extract which codepoints
are emoji and use that to set up the fontsets appropriately.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 20:55 ` Robert Pluim
@ 2020-03-03 12:51 ` Robert Pluim
2020-03-03 16:06 ` Eli Zaretskii
2020-03-03 17:22 ` Eli Zaretskii
1 sibling, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-03 12:51 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Mon, 02 Mar 2020 21:55:32 +0100, Robert Pluim <rpluim@gmail.com> said:
Robert> One thing we could do with emoji-data.txt is extract which codepoints
Robert> are emoji and use that to set up the fontsets appropriately.
That looks easy enough. Of course the fontsets end up not being used
for certain codepoints because of use-default-font-for-symbols
defaulting to t.
What should be done here? Create another char table analagous to
char-script-table, add all the emojis from emoji-data.txt to it, and
check whether the char is in that table in fontset.c:face_for_char?
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-03 12:51 ` Robert Pluim
@ 2020-03-03 16:06 ` Eli Zaretskii
2020-03-04 7:23 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-03 16:06 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Tue, 03 Mar 2020 13:51:14 +0100
>
> >>>>> On Mon, 02 Mar 2020 21:55:32 +0100, Robert Pluim <rpluim@gmail.com> said:
> Robert> One thing we could do with emoji-data.txt is extract which codepoints
> Robert> are emoji and use that to set up the fontsets appropriately.
>
> That looks easy enough. Of course the fontsets end up not being used
> for certain codepoints because of use-default-font-for-symbols
> defaulting to t.
>
> What should be done here? Create another char table analagous to
> char-script-table, add all the emojis from emoji-data.txt to it, and
> check whether the char is in that table in fontset.c:face_for_char?
I think it would be simpler and cleaner to define a new script,
'emoji', and update admin/unidata/blocks.awk to produce it for the
relevant blocks (including Variation Selectors, btw). Then no change
is needed in face_for_char, since that is only in effect for the
'symbol' script. As a nice bonus, this will also allow a much easier
customization of the fontsets, so that fonts for symbols can be
different from fonts for emoji.
There's an issue with the codepoints in the U+2XXX and U+3XXX blocks:
some of them can have Emoji glyph variations, but putting them into
the 'emoji' script is probably not a good idea, as long as Emacs
selects a font based on a single character. I guess we will have to
leave them in 'symbol' for now.
The file admin/notes/unicode tells what has to be done when a new
script is added to Emacs.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-02 20:55 ` Robert Pluim
2020-03-03 12:51 ` Robert Pluim
@ 2020-03-03 17:22 ` Eli Zaretskii
2020-03-04 7:26 ` Robert Pluim
1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-03 17:22 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Mon, 02 Mar 2020 21:55:32 +0100
>
> Eli> Also, what about the sequences in other emoji-*.txt files? Or are
> Eli> they already covered?
>
> What Iʼve extracted from emoji-sequences.txt is in the comments at the
> end of emoji-zwj.awk, we can just add that to the output if you agree.
Sure, let's do that. Or do you see any reasons why not?
> I donʼt think we can support the Keycaps emoji, since the base
> characters are ASCII.
Right.
> One thing we could do with emoji-data.txt is extract which codepoints
> are emoji and use that to set up the fontsets appropriately.
See my other message about this.
Thanks.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-03 16:06 ` Eli Zaretskii
@ 2020-03-04 7:23 ` Robert Pluim
2020-03-04 9:25 ` Robert Pluim
2020-03-04 15:51 ` Eli Zaretskii
0 siblings, 2 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-04 7:23 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Tue, 03 Mar 2020 18:06:06 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> What should be done here? Create another char table analagous to
>> char-script-table, add all the emojis from emoji-data.txt to it, and
>> check whether the char is in that table in fontset.c:face_for_char?
Eli> I think it would be simpler and cleaner to define a new script,
Eli> 'emoji', and update admin/unidata/blocks.awk to produce it for the
Eli> relevant blocks (including Variation Selectors, btw). Then no change
Eli> is needed in face_for_char, since that is only in effect for the
Eli> 'symbol' script. As a nice bonus, this will also allow a much easier
Eli> customization of the fontsets, so that fonts for symbols can be
Eli> different from fonts for emoji.
Hmm, but a character can only have one script, no? That would put
Emacs at odds with Blocks.txt, I guess thatʼs why Unicode implemented
this using character properties. Having said that, we already donʼt
exactly follow Blocks.txt anyway.
Eli> There's an issue with the codepoints in the U+2XXX and U+3XXX blocks:
Eli> some of them can have Emoji glyph variations, but putting them into
Eli> the 'emoji' script is probably not a good idea, as long as Emacs
Eli> selects a font based on a single character. I guess we will have to
Eli> leave them in 'symbol' for now.
OK. We can revisit 2XXX and 3XXX later.
Ancillary question: what fonts should we use in the default fontsets
for emoji? So far I have:
X => Noto Color Emoji (+EmojiOne?)
NS => Apple Color Emoji
Windows => ?
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-03 17:22 ` Eli Zaretskii
@ 2020-03-04 7:26 ` Robert Pluim
0 siblings, 0 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-04 7:26 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Tue, 03 Mar 2020 19:22:11 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
>> Date: Mon, 02 Mar 2020 21:55:32 +0100
>>
Eli> Also, what about the sequences in other emoji-*.txt files? Or are
Eli> they already covered?
>>
>> What Iʼve extracted from emoji-sequences.txt is in the comments at the
>> end of emoji-zwj.awk, we can just add that to the output if you agree.
Eli> Sure, let's do that. Or do you see any reasons why not?
No. Done (with my typos fixed :-) ).
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-04 7:23 ` Robert Pluim
@ 2020-03-04 9:25 ` Robert Pluim
2020-03-04 16:04 ` Eli Zaretskii
2020-03-04 15:51 ` Eli Zaretskii
1 sibling, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-04 9:25 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Wed, 04 Mar 2020 08:23:33 +0100, Robert Pluim <rpluim@gmail.com> said:
>>>>> On Tue, 03 Mar 2020 18:06:06 +0200, Eli Zaretskii <eliz@gnu.org> said:
Robert> Hmm, but a character can only have one script, no? That would put
Robert> Emacs at odds with Blocks.txt, I guess thatʼs why Unicode implemented
Robert> this using character properties. Having said that, we already donʼt
Robert> exactly follow Blocks.txt anyway.
One issue this has thrown up is that the hypothetical 'emoji' script
completely subsumes U+1F000..U+1F02F (mahjong-tile) and
U+1F030..U+1F09F (domino-tile), so those scripts would no longer
exist.
Eli> There's an issue with the codepoints in the U+2XXX and U+3XXX blocks:
Eli> some of them can have Emoji glyph variations, but putting them into
Eli> the 'emoji' script is probably not a good idea, as long as Emacs
Eli> selects a font based on a single character. I guess we will have to
Eli> leave them in 'symbol' for now.
Robert> OK. We can revisit 2XXX and 3XXX later.
Your concern here is what Emacs should do when one of the characters in this
range is followed by U+FE0E or U+FE0F?
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-04 7:23 ` Robert Pluim
2020-03-04 9:25 ` Robert Pluim
@ 2020-03-04 15:51 ` Eli Zaretskii
2020-03-04 16:58 ` Robert Pluim
1 sibling, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-04 15:51 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Wed, 04 Mar 2020 08:23:33 +0100
>
> >>>>> On Tue, 03 Mar 2020 18:06:06 +0200, Eli Zaretskii <eliz@gnu.org> said:
> >> What should be done here? Create another char table analagous to
> >> char-script-table, add all the emojis from emoji-data.txt to it, and
> >> check whether the char is in that table in fontset.c:face_for_char?
>
> Eli> I think it would be simpler and cleaner to define a new script,
> Eli> 'emoji', and update admin/unidata/blocks.awk to produce it for the
> Eli> relevant blocks (including Variation Selectors, btw). Then no change
> Eli> is needed in face_for_char, since that is only in effect for the
> Eli> 'symbol' script. As a nice bonus, this will also allow a much easier
> Eli> customization of the fontsets, so that fonts for symbols can be
> Eli> different from fonts for emoji.
>
> Hmm, but a character can only have one script, no?
Yes, but why would we need the Emoji to belong to more than one
script?
> That would put Emacs at odds with Blocks.txt, I guess thatʼs why
> Unicode implemented this using character properties. Having said
> that, we already donʼt exactly follow Blocks.txt anyway.
Exactly. We only follow Blocks.txt when a block corresponds to some
script, because scripts have a meaning for font selection. But
'symbol' is not a script in Unicode, it's entirely our own invention,
and we lump there many blocks. I see no problem with moving Emoji out
of there into their own script.
> Ancillary question: what fonts should we use in the default fontsets
> for emoji? So far I have:
>
> X => Noto Color Emoji (+EmojiOne?)
> NS => Apple Color Emoji
> Windows => ?
Windows has Segoe UI Emoji as its font for Emoji.
However, we only put free fonts in our fontsets, so I think only Noto
Color Emoji qualifies. Users of macOS and MS-Windows can either
install that font or rely on the OS built-in capabilities to find the
required font.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-04 9:25 ` Robert Pluim
@ 2020-03-04 16:04 ` Eli Zaretskii
2020-03-04 16:54 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-04 16:04 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Wed, 04 Mar 2020 10:25:45 +0100
>
> One issue this has thrown up is that the hypothetical 'emoji' script
> completely subsumes U+1F000..U+1F02F (mahjong-tile) and
> U+1F030..U+1F09F (domino-tile), so those scripts would no longer
> exist.
That shouldn't happen. The 'emoji' script should include the
following blocks:
1F300 .. 1F5FF (Miscellaneous Symbols and Pictographs)
1F600 .. 1F64F (Emoticons)
1F680 .. 1F6FF (Transport and Map Symbols)
1F900 .. 1F9FF (Supplemental Symbols and Pictographs)
I understand that there are scattered Emoji elsewhere, but even if we
make them individually belong to Emoji, we don't need to do that for
mahjong-tile and domino-tile blocks.
> Eli> There's an issue with the codepoints in the U+2XXX and U+3XXX blocks:
> Eli> some of them can have Emoji glyph variations, but putting them into
> Eli> the 'emoji' script is probably not a good idea, as long as Emacs
> Eli> selects a font based on a single character. I guess we will have to
> Eli> leave them in 'symbol' for now.
>
> Robert> OK. We can revisit 2XXX and 3XXX later.
>
> Your concern here is what Emacs should do when one of the characters in this
> range is followed by U+FE0E or U+FE0F?
The latter. The former doesn't affect the visual appearance of those
base characters, so it's basically a no-op.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-04 16:04 ` Eli Zaretskii
@ 2020-03-04 16:54 ` Robert Pluim
2020-03-04 17:19 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-04 16:54 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Wed, 04 Mar 2020 18:04:40 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
>> Date: Wed, 04 Mar 2020 10:25:45 +0100
>>
>> One issue this has thrown up is that the hypothetical 'emoji' script
>> completely subsumes U+1F000..U+1F02F (mahjong-tile) and
>> U+1F030..U+1F09F (domino-tile), so those scripts would no longer
>> exist.
Eli> That shouldn't happen. The 'emoji' script should include the
Eli> following blocks:
Eli> 1F300 .. 1F5FF (Miscellaneous Symbols and Pictographs)
Eli> 1F600 .. 1F64F (Emoticons)
Eli> 1F680 .. 1F6FF (Transport and Map Symbols)
Eli> 1F900 .. 1F9FF (Supplemental Symbols and Pictographs)
Eli> I understand that there are scattered Emoji elsewhere, but even if we
Eli> make them individually belong to Emoji, we don't need to do that for
Eli> mahjong-tile and domino-tile blocks.
My mistake. Those two ranges have the 'Extended_Pictographic' property
in emoji-data.txt, not 'Emoji', so I should just ignore those (and for
consistency not set the individual codepoints within mahjong-tile and
domino-tile as emoji). My nice clean awk script is growing warts :-)
>> Your concern here is what Emacs should do when one of the characters in this
>> range is followed by U+FE0E or U+FE0F?
Eli> The latter. The former doesn't affect the visual appearance of those
Eli> base characters, so it's basically a no-op.
If we put the specific codepoints in the 2XXX and 3XXX blocks that
have 'Emoji' property in the emoji script, they'll display by default
with a nice font, and will be composed if they're followed by
FE0F. Would that be such a bad thing?
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-04 15:51 ` Eli Zaretskii
@ 2020-03-04 16:58 ` Robert Pluim
2020-03-04 17:24 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-04 16:58 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Wed, 04 Mar 2020 17:51:44 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> That would put Emacs at odds with Blocks.txt, I guess thatʼs why
>> Unicode implemented this using character properties. Having said
>> that, we already donʼt exactly follow Blocks.txt anyway.
Eli> Exactly. We only follow Blocks.txt when a block corresponds to some
Eli> script, because scripts have a meaning for font selection. But
Eli> 'symbol' is not a script in Unicode, it's entirely our own invention,
Eli> and we lump there many blocks. I see no problem with moving Emoji out
Eli> of there into their own script.
OK.
>> Ancillary question: what fonts should we use in the default fontsets
>> for emoji? So far I have:
>>
>> X => Noto Color Emoji (+EmojiOne?)
>> NS => Apple Color Emoji
>> Windows => ?
Eli> Windows has Segoe UI Emoji as its font for Emoji.
Eli> However, we only put free fonts in our fontsets, so I think only Noto
Eli> Color Emoji qualifies. Users of macOS and MS-Windows can either
Eli> install that font or rely on the OS built-in capabilities to find the
Eli> required font.
Hmm, I guess that means I should test on macOS and MS-Windows without
Symbola installed to see what it does.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-04 16:54 ` Robert Pluim
@ 2020-03-04 17:19 ` Eli Zaretskii
2020-03-05 7:29 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-04 17:19 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Wed, 04 Mar 2020 17:54:17 +0100
>
> >> Your concern here is what Emacs should do when one of the characters in this
> >> range is followed by U+FE0E or U+FE0F?
>
> Eli> The latter. The former doesn't affect the visual appearance of those
> Eli> base characters, so it's basically a no-op.
>
> If we put the specific codepoints in the 2XXX and 3XXX blocks that
> have 'Emoji' property in the emoji script, they'll display by default
> with a nice font, and will be composed if they're followed by
> FE0F. Would that be such a bad thing?
I think it would be jarring to see, say, U+2640 ♀ or U+266B ♫ as emoji
in the middle of otherwise "normal" text.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-04 16:58 ` Robert Pluim
@ 2020-03-04 17:24 ` Eli Zaretskii
0 siblings, 0 replies; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-04 17:24 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Wed, 04 Mar 2020 17:58:57 +0100
>
> Eli> Windows has Segoe UI Emoji as its font for Emoji.
>
> Eli> However, we only put free fonts in our fontsets, so I think only Noto
> Eli> Color Emoji qualifies. Users of macOS and MS-Windows can either
> Eli> install that font or rely on the OS built-in capabilities to find the
> Eli> required font.
>
> Hmm, I guess that means I should test on macOS and MS-Windows without
> Symbola installed to see what it does.
I can do that on Windows.
There's more to do about this on Windows because we need to see that
the w32-find-non-USB-fonts machinery finds suitable fonts for Emoji
(since most of the Emoji blocks have no Unicode subrange bits defined
for them, and thus the "normal" searching for a suitable font, when
Noto Color Emoji is not installed, will most probably fail to find a
font).
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-04 17:19 ` Eli Zaretskii
@ 2020-03-05 7:29 ` Robert Pluim
2020-03-05 7:56 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-05 7:29 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 593 bytes --]
>>>>> On Wed, 04 Mar 2020 19:19:13 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> If we put the specific codepoints in the 2XXX and 3XXX blocks that
>> have 'Emoji' property in the emoji script, they'll display by default
>> with a nice font, and will be composed if they're followed by
>> FE0F. Would that be such a bad thing?
Eli> I think it would be jarring to see, say, U+2640 ♀ or U+266B ♫ as emoji
Eli> in the middle of otherwise "normal" text.
Those are already treated as symbols, so they already donʼt look like
letters.
Hereʼs emacs-27:
[-- Attachment #2: emoji-emacs27.png --]
[-- Type: image/png, Size: 3851 bytes --]
[-- Attachment #3: Type: text/plain, Size: 80 bytes --]
And hereʼs the same text displayed with Apple Color Emoji for the
emoji:
[-- Attachment #4: emoji-emacs-color.png --]
[-- Type: image/png, Size: 4573 bytes --]
[-- Attachment #5: Type: text/plain, Size: 8 bytes --]
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 7:29 ` Robert Pluim
@ 2020-03-05 7:56 ` Eli Zaretskii
2020-03-05 8:13 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-05 7:56 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Thu, 05 Mar 2020 08:29:44 +0100
>
> Eli> I think it would be jarring to see, say, U+2640 ♀ or U+266B ♫ as emoji
> Eli> in the middle of otherwise "normal" text.
>
> Those are already treated as symbols, so they already donʼt look like
> letters.
Why not like letters? is your Emacs using a different font for them?
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 7:56 ` Eli Zaretskii
@ 2020-03-05 8:13 ` Robert Pluim
2020-03-05 9:38 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-05 8:13 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Thu, 05 Mar 2020 09:56:04 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
>> Date: Thu, 05 Mar 2020 08:29:44 +0100
>>
Eli> I think it would be jarring to see, say, U+2640 ♀ or U+266B ♫ as emoji
Eli> in the middle of otherwise "normal" text.
>>
>> Those are already treated as symbols, so they already donʼt look like
>> letters.
Eli> Why not like letters? is your Emacs using a different font for them?
'emacs27 -Q' uses Menlo as the default font, which has glyphs for
those two characters. What does your font display them as?
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 8:13 ` Robert Pluim
@ 2020-03-05 9:38 ` Eli Zaretskii
2020-03-05 9:48 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-05 9:38 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Thu, 05 Mar 2020 09:13:03 +0100
>
> >>>>> On Thu, 05 Mar 2020 09:56:04 +0200, Eli Zaretskii <eliz@gnu.org> said:
>
> >> From: Robert Pluim <rpluim@gmail.com>
> >> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> >> Date: Thu, 05 Mar 2020 08:29:44 +0100
> >>
> Eli> I think it would be jarring to see, say, U+2640 ♀ or U+266B ♫ as emoji
> Eli> in the middle of otherwise "normal" text.
> >>
> >> Those are already treated as symbols, so they already donʼt look like
> >> letters.
>
> Eli> Why not like letters? is your Emacs using a different font for them?
>
> 'emacs27 -Q' uses Menlo as the default font, which has glyphs for
> those two characters.
Which is the intended behavior: we want the symbols in their text
representation be displayed by the default font, if possible.
> What does your font display them as?
It also uses the default font, as expected.
So I see no problem here, and making this display by a non-default
font would be a regression, IMO, since that font could have different
height, be variable-pitch, etc.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 9:38 ` Eli Zaretskii
@ 2020-03-05 9:48 ` Robert Pluim
2020-03-05 9:53 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-05 9:48 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Thu, 05 Mar 2020 11:38:03 +0200, Eli Zaretskii <eliz@gnu.org> said:
Eli> So I see no problem here, and making this display by a non-default
Eli> font would be a regression, IMO, since that font could have different
Eli> height, be variable-pitch, etc.
But isnʼt that the whole thing weʼre discussing here: displaying
characters with the Emoji property with a prettier font than either
the default font or Symbola?
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 9:48 ` Robert Pluim
@ 2020-03-05 9:53 ` Eli Zaretskii
2020-03-05 14:46 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-05 9:53 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Thu, 05 Mar 2020 10:48:02 +0100
>
> >>>>> On Thu, 05 Mar 2020 11:38:03 +0200, Eli Zaretskii <eliz@gnu.org> said:
>
> Eli> So I see no problem here, and making this display by a non-default
> Eli> font would be a regression, IMO, since that font could have different
> Eli> height, be variable-pitch, etc.
>
> But isnʼt that the whole thing weʼre discussing here: displaying
> characters with the Emoji property with a prettier font than either
> the default font or Symbola?
The u+2XXX and U+3XXX characters are not Emoji by default, they are
supposed to be displayed as Emoji only if followed by the Emoji-style
variation selector. Otherwise, they should be displayed in text
representation.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 9:53 ` Eli Zaretskii
@ 2020-03-05 14:46 ` Robert Pluim
2020-03-05 14:59 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-05 14:46 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 706 bytes --]
>>>>> On Thu, 05 Mar 2020 11:53:22 +0200, Eli Zaretskii <eliz@gnu.org> said:
Eli> The u+2XXX and U+3XXX characters are not Emoji by default, they are
Eli> supposed to be displayed as Emoji only if followed by the Emoji-style
Eli> variation selector. Otherwise, they should be displayed in text
Eli> representation.
Ok, so based on emoji-data.txt, my awk script produces the attached
.el file. It excludes U+2XXX and U+3XXX, plus U+A9 and U+AE and
anything ASCII. Note that there are duplicates in there, since some
codepoints have multiple Emoji-type properties. Of course, we could
just decide a bunch of ranges from Block.txt that we want to treat as
emoji, and hardcode that.
Robert
[-- Attachment #2: emoji-fontset.el --]
[-- Type: application/emacs-lisp, Size: 5506 bytes --]
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 14:46 ` Robert Pluim
@ 2020-03-05 14:59 ` Eli Zaretskii
2020-03-05 15:11 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-05 14:59 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Thu, 05 Mar 2020 15:46:34 +0100
>
> Of course, we could just decide a bunch of ranges from Block.txt
> that we want to treat as emoji, and hardcode that.
I think that is preferable. But I think we should pick up block
names, not codepoint ranges. I think I posted those ranges a while
back.
Thanks.
> (defun emoji-fontset-setup-default-fontset (&optional fname)
> (let ((font (or fname) "Noto Color Emoji"))
> (dolist (elt emoji-codepoint-list)
> (set-fontset-font "fontset-default" elt
> font nil 'prepend))))
I think we should just produce the definition of the 'emoji' script in
charscript.el, and then modify fontset.el to use Not Color Emoji for
that script.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 14:59 ` Eli Zaretskii
@ 2020-03-05 15:11 ` Robert Pluim
2020-03-05 15:24 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-05 15:11 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Thu, 05 Mar 2020 16:59:46 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
>> Date: Thu, 05 Mar 2020 15:46:34 +0100
>>
>> Of course, we could just decide a bunch of ranges from Block.txt
>> that we want to treat as emoji, and hardcode that.
Eli> I think that is preferable. But I think we should pick up block
Eli> names, not codepoint ranges. I think I posted those ranges a while
Eli> back.
OK, thatʼs just a modification of blocks.awk
>> (defun emoji-fontset-setup-default-fontset (&optional fname)
>> (let ((font (or fname) "Noto Color Emoji"))
>> (dolist (elt emoji-codepoint-list)
>> (set-fontset-font "fontset-default" elt
>> font nil 'prepend))))
Eli> I think we should just produce the definition of the 'emoji' script in
Eli> charscript.el, and then modify fontset.el to use Not Color Emoji for
Eli> that script.
OK. So basically weʼre inventing an 'emoji' script that has little to
do with Unicode's idea of emoji.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 15:11 ` Robert Pluim
@ 2020-03-05 15:24 ` Eli Zaretskii
2020-03-05 16:08 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-05 15:24 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Thu, 05 Mar 2020 16:11:16 +0100
>
> Eli> I think we should just produce the definition of the 'emoji' script in
> Eli> charscript.el, and then modify fontset.el to use Not Color Emoji for
> Eli> that script.
>
> OK. So basically weʼre inventing an 'emoji' script
Yes.
> that has little to do with Unicode's idea of emoji.
I don't think it has little to do with the Unicode idea, it just
doesn't use the database. The blocks I was talking about are all
Emoji blocks, and Unicode is generally careful to put related
characters into the same blocks.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 15:24 ` Eli Zaretskii
@ 2020-03-05 16:08 ` Robert Pluim
2020-03-05 19:04 ` Eli Zaretskii
0 siblings, 1 reply; 45+ messages in thread
From: Robert Pluim @ 2020-03-05 16:08 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, emacs-devel
>>>>> On Thu, 05 Mar 2020 17:24:01 +0200, Eli Zaretskii <eliz@gnu.org> said:
Eli> I don't think it has little to do with the Unicode idea, it just
Eli> doesn't use the database. The blocks I was talking about are all
Eli> Emoji blocks, and Unicode is generally careful to put related
Eli> characters into the same blocks.
If you look at the list of Emoji codepoints I sent earlier, I think
you'll agree that they're all over the place. But at least this makes
the patch smaller :-)
Note that with this, and Symbola disabled, this does not display a
glyph for U+1F300 on macOS unless I prepend 'Apple Color Emoji' to the
frame's fontset. Is that expected on macOS?
Robert
diff --git c/admin/unidata/blocks.awk i/admin/unidata/blocks.awk
index 03acf1e4be..a6844871c5 100755
--- c/admin/unidata/blocks.awk
+++ i/admin/unidata/blocks.awk
@@ -54,7 +54,8 @@ BEGIN {
alias["enclosed alphanumerics"] = "symbol"
alias["box drawing"] = "symbol"
alias["block elements"] = "symbol"
- alias["miscellaneous symbols"] = "symbol"
+ alias["miscellaneous symbols and pictographs"] = "emoji"
+ alias["emoticons"] = "emoji"
alias["cjk strokes"] = "cjk-misc"
alias["cjk symbols and punctuation"] = "cjk-misc"
alias["halfwidth and fullwidth forms"] = "cjk-misc"
@@ -99,7 +100,8 @@ function name2alias(name , w, w2) {
else if (name ~ /cuneiform number/) return "cuneiform-numbers-and-punctuation"
else if (name ~ /cuneiform/) return "cuneiform"
else if (name ~ /mathematical alphanumeric symbol/) return "mathematical"
- else if (name ~ /punctuation|mathematical|arrows|currency|superscript|small form variants|geometric|dingbats|enclosed|alchemical|pictograph|emoticon|transport/) return "symbol"
+ else if (name ~ /transport|supplemental symbols/) return "emoji"
+ else if (name ~ /punctuation|mathematical|arrows|currency|superscript|small form variants|geometric|dingbats|enclosed|alchemical|pictograph/) return "symbol"
else if (name ~ /canadian aboriginal/) return "canadian-aboriginal"
else if (name ~ /katakana|hiragana/) return "kana"
else if (name ~ /myanmar/) return "burmese"
diff --git c/lisp/international/fontset.el i/lisp/international/fontset.el
index 529c7bb88b..e4a34d5f1c 100644
--- c/lisp/international/fontset.el
+++ i/lisp/international/fontset.el
@@ -267,7 +267,8 @@ font-encoding-charset-alist
(indic-siyaq-number #x1ec71)
(ottoman-siyaq-number #x1ed01)
(mahjong-tile #x1F000)
- (domino-tile #x1F030)))
+ (domino-tile #x1F030)
+ (emoji #x1F300)))
(defvar otf-script-alist)
@@ -866,6 +867,9 @@ setup-default-fontset
(#x1FA00 . #x1FA6F))) ;; Chess Symbols
(set-fontset-font "fontset-default" symbol-subgroup
'("Symbola" . "iso10646-1") nil 'prepend))
+ ;; This sets up the Emoji codepoints to use prettier fonts.
+ (set-fontset-font "fontset-default" 'emoji
+ "Noto Color Emoji" nil 'prepend)
;; Box Drawing and Block Elements
(set-fontset-font "fontset-default" '(#x2500 . #x259F)
'("FreeMono" . "iso10646-1") nil 'prepend)
^ permalink raw reply related [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 16:08 ` Robert Pluim
@ 2020-03-05 19:04 ` Eli Zaretskii
2020-03-06 16:32 ` Robert Pluim
0 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-05 19:04 UTC (permalink / raw)
To: Robert Pluim, YAMAMOTO Mitsuharu; +Cc: monnier, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Thu, 05 Mar 2020 17:08:12 +0100
>
> >>>>> On Thu, 05 Mar 2020 17:24:01 +0200, Eli Zaretskii <eliz@gnu.org> said:
>
> Eli> I don't think it has little to do with the Unicode idea, it just
> Eli> doesn't use the database. The blocks I was talking about are all
> Eli> Emoji blocks, and Unicode is generally careful to put related
> Eli> characters into the same blocks.
>
> If you look at the list of Emoji codepoints I sent earlier, I think
> you'll agree that they're all over the place. But at least this makes
> the patch smaller :-)
Yes. And I think the Emoji that are outside of those 4 blocks are of
the kind that by default display in their text presentation, isn't
that right?
> Note that with this, and Symbola disabled, this does not display a
> glyph for U+1F300 on macOS unless I prepend 'Apple Color Emoji' to the
> frame's fontset. Is that expected on macOS?
I'm not familiar with how Emacs on macOS looks for fonts, sorry. On
Windows, we will need the help of w32-find-non-USB-fonts to find the
built-in fonts for Emoji (because there are no Unicode sub-range bits
for Emoji), if Noto Color Emoji is not installed, so maybe something
similar is needed on macOS. Maybe Yamamoto-san (CC'ed) can chime in
and help us here.
> - else if (name ~ /punctuation|mathematical|arrows|currency|superscript|small form variants|geometric|dingbats|enclosed|alchemical|pictograph|emoticon|transport/) return "symbol"
> + else if (name ~ /transport|supplemental symbols/) return "emoji"
> + else if (name ~ /punctuation|mathematical|arrows|currency|superscript|small form variants|geometric|dingbats|enclosed|alchemical|pictograph/) return "symbol"
I think we should also convert "variation selectors" to "emoji". We
must have the same font selected for variation selectors and for the
emoticons, otherwise character composition will not work.
> + (emoji #x1F300)))
I think we should add at least #x1F600 and #xFE0F as representative
characters for 'emoji'.
> + (set-fontset-font "fontset-default" 'emoji
> + "Noto Color Emoji" nil 'prepend)
I think it's better to use '("Noto Color Emoji" . "iso10646-1")
instead of just the family name, for consistency if nothing else.
Thanks.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-05 19:04 ` Eli Zaretskii
@ 2020-03-06 16:32 ` Robert Pluim
2020-03-06 17:05 ` Eli Zaretskii
` (2 more replies)
0 siblings, 3 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-06 16:32 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, YAMAMOTO Mitsuharu, emacs-devel
>>>>> On Thu, 05 Mar 2020 21:04:58 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> If you look at the list of Emoji codepoints I sent earlier, I think
>> you'll agree that they're all over the place. But at least this makes
>> the patch smaller :-)
Eli> Yes. And I think the Emoji that are outside of those 4 blocks are of
Eli> the kind that by default display in their text presentation, isn't
Eli> that right?
A lot of them, yes, but not all. E.g. U+231A has Emoji == yes, and
Emoji_Presentation == yes.
>> Note that with this, and Symbola disabled, this does not display a
>> glyph for U+1F300 on macOS unless I prepend 'Apple Color Emoji' to the
>> frame's fontset. Is that expected on macOS?
Eli> I'm not familiar with how Emacs on macOS looks for fonts, sorry. On
Eli> Windows, we will need the help of w32-find-non-USB-fonts to find the
Eli> built-in fonts for Emoji (because there are no Unicode sub-range bits
Eli> for Emoji), if Noto Color Emoji is not installed, so maybe something
Eli> similar is needed on macOS. Maybe Yamamoto-san (CC'ed) can chime in
Eli> and help us here.
So this was a combination of me forgetting to add 'emoji' into the
list of 'simple' scripts in fontset.el, and the following code in
macfont.m:
/* Don't use a color bitmap font unless its family is
explicitly specified. */
if ((sym_traits & kCTFontTraitColorGlyphs) && NILP (family))
continue;
Yamamoto-san, Iʼm not sure I understand the rationale for excluding
colour fonts unless explicitly requested, could you elaborate?
>> - else if (name ~ /punctuation|mathematical|arrows|currency|superscript|small form variants|geometric|dingbats|enclosed|alchemical|pictograph|emoticon|transport/) return "symbol"
>> + else if (name ~ /transport|supplemental symbols/) return "emoji"
>> + else if (name ~ /punctuation|mathematical|arrows|currency|superscript|small form variants|geometric|dingbats|enclosed|alchemical|pictograph/) return "symbol"
Eli> I think we should also convert "variation selectors" to "emoji". We
Eli> must have the same font selected for variation selectors and for the
Eli> emoticons, otherwise character composition will not work.
Done for FE00-FE0F.
>> + (emoji #x1F300)))
Eli> I think we should add at least #x1F600 and #xFE0F as representative
Eli> characters for 'emoji'.
OK.
>> + (set-fontset-font "fontset-default" 'emoji
>> + "Noto Color Emoji" nil 'prepend)
Eli> I think it's better to use '("Noto Color Emoji" . "iso10646-1")
Eli> instead of just the family name, for consistency if nothing else.
Right. For some reason I thought it didnʼt work with iso10646-1, but
my testing must have been flawed.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-06 16:32 ` Robert Pluim
@ 2020-03-06 17:05 ` Eli Zaretskii
2020-03-06 17:35 ` Robert Pluim
2020-03-09 23:12 ` chad
2020-03-22 5:18 ` YAMAMOTO Mitsuharu
2 siblings, 1 reply; 45+ messages in thread
From: Eli Zaretskii @ 2020-03-06 17:05 UTC (permalink / raw)
To: Robert Pluim; +Cc: monnier, mituharu, emacs-devel
> From: Robert Pluim <rpluim@gmail.com>
> Cc: YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>,
> monnier@iro.umontreal.ca, emacs-devel@gnu.org
> Date: Fri, 06 Mar 2020 17:32:40 +0100
>
> >>>>> On Thu, 05 Mar 2020 21:04:58 +0200, Eli Zaretskii <eliz@gnu.org> said:
>
> >> If you look at the list of Emoji codepoints I sent earlier, I think
> >> you'll agree that they're all over the place. But at least this makes
> >> the patch smaller :-)
>
> Eli> Yes. And I think the Emoji that are outside of those 4 blocks are of
> Eli> the kind that by default display in their text presentation, isn't
> Eli> that right?
>
> A lot of them, yes, but not all. E.g. U+231A has Emoji == yes, and
> Emoji_Presentation == yes.
We can always augment by hand what charscript.el does, for select
codepoints, if we want.
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-06 17:05 ` Eli Zaretskii
@ 2020-03-06 17:35 ` Robert Pluim
0 siblings, 0 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-06 17:35 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: monnier, mituharu, emacs-devel
>>>>> On Fri, 06 Mar 2020 19:05:51 +0200, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Cc: YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>,
>> monnier@iro.umontreal.ca, emacs-devel@gnu.org
>> Date: Fri, 06 Mar 2020 17:32:40 +0100
>>
>> >>>>> On Thu, 05 Mar 2020 21:04:58 +0200, Eli Zaretskii <eliz@gnu.org> said:
>>
>> >> If you look at the list of Emoji codepoints I sent earlier, I think
>> >> you'll agree that they're all over the place. But at least this makes
>> >> the patch smaller :-)
>>
Eli> Yes. And I think the Emoji that are outside of those 4 blocks are of
Eli> the kind that by default display in their text presentation, isn't
Eli> that right?
>>
>> A lot of them, yes, but not all. E.g. U+231A has Emoji == yes, and
>> Emoji_Presentation == yes.
Eli> We can always augment by hand what charscript.el does, for select
Eli> codepoints, if we want.
Sure. The list isnʼt that long.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-06 16:32 ` Robert Pluim
2020-03-06 17:05 ` Eli Zaretskii
@ 2020-03-09 23:12 ` chad
2020-03-10 7:33 ` Robert Pluim
2020-03-22 5:18 ` YAMAMOTO Mitsuharu
2 siblings, 1 reply; 45+ messages in thread
From: chad @ 2020-03-09 23:12 UTC (permalink / raw)
To: Robert Pluim
Cc: Eli Zaretskii, Stefan Monnier, YAMAMOTO Mitsuharu,
EMACS development team
[-- Attachment #1: Type: text/plain, Size: 950 bytes --]
On Fri, Mar 6, 2020 at 8:33 AM Robert Pluim <rpluim@gmail.com> wrote:
> So this was a combination of me forgetting to add 'emoji' into the
> list of 'simple' scripts in fontset.el, and the following code in
> macfont.m:
>
> /* Don't use a color bitmap font unless its family is
> explicitly specified. */
> if ((sym_traits & kCTFontTraitColorGlyphs) && NILP (family))
> continue;
>
> Yamamoto-san, Iʼm not sure I understand the rationale for excluding
> colour fonts unless explicitly requested, could you elaborate?
>
I moved away from macOS several months ago, but if memory serves, this was
(at the time) a feature that only worked on non-free OSs, and a request was
made (from Richard, if memory serves twice) to limit the feature until it
could be adequately supported on free/libre systems.
If I'm barking up the wrong tree, please accept my apologies in advance.
~Chad
[-- Attachment #2: Type: text/html, Size: 1381 bytes --]
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-09 23:12 ` chad
@ 2020-03-10 7:33 ` Robert Pluim
0 siblings, 0 replies; 45+ messages in thread
From: Robert Pluim @ 2020-03-10 7:33 UTC (permalink / raw)
To: chad
Cc: Eli Zaretskii, Stefan Monnier, YAMAMOTO Mitsuharu,
EMACS development team
>>>>> On Mon, 9 Mar 2020 16:12:04 -0700, chad <yandros@gmail.com> said:
chad> On Fri, Mar 6, 2020 at 8:33 AM Robert Pluim <rpluim@gmail.com> wrote:
>> So this was a combination of me forgetting to add 'emoji' into the
>> list of 'simple' scripts in fontset.el, and the following code in
>> macfont.m:
>>
>> /* Don't use a color bitmap font unless its family is
>> explicitly specified. */
>> if ((sym_traits & kCTFontTraitColorGlyphs) && NILP (family))
>> continue;
>>
>> Yamamoto-san, Iʼm not sure I understand the rationale for excluding
>> colour fonts unless explicitly requested, could you elaborate?
>>
chad> I moved away from macOS several months ago, but if memory serves, this was
chad> (at the time) a feature that only worked on non-free OSs, and a request was
chad> made (from Richard, if memory serves twice) to limit the feature until it
chad> could be adequately supported on free/libre systems.
Thatʼs true, and up until a while ago the feature was completely
disabled. Now itʼs just disabled unless you specifically request
'Apple Color Emoji' or similar, which in this case weʼre not.
Robert
^ permalink raw reply [flat|nested] 45+ messages in thread
* Re: emacs-27 60c84ad: ; * etc/TODO: Fix last change.
2020-03-06 16:32 ` Robert Pluim
2020-03-06 17:05 ` Eli Zaretskii
2020-03-09 23:12 ` chad
@ 2020-03-22 5:18 ` YAMAMOTO Mitsuharu
2 siblings, 0 replies; 45+ messages in thread
From: YAMAMOTO Mitsuharu @ 2020-03-22 5:18 UTC (permalink / raw)
To: Robert Pluim; +Cc: Eli Zaretskii, monnier, emacs-devel
[-- Attachment #1: Type: text/plain, Size: 3947 bytes --]
On Sat, 07 Mar 2020 01:32:40 +0900,
Robert Pluim wrote:
>
> /* Don't use a color bitmap font unless its family is
> explicitly specified. */
> if ((sym_traits & kCTFontTraitColorGlyphs) && NILP (family))
> continue;
>
> Yamamoto-san, Iʼm not sure I understand the rationale for excluding
> colour fonts unless explicitly requested, could you elaborate?
I wrote this part originally for the Mac port when I added the
Variation Selectors 15 and 16 support in 2013. In the Mac port, the
"Apple Color Emoji" font is specified as a fallback so text style is
preferred for the characters having both text and emoji styles (IIRC,
there was no concept of Emoji_Presentation=Yes at that time). The
exceptions are VS16, Regional Indicators, and Emoji Modifiers, so as
to avoid lots of font lookups until it reaches to the fallback one:
(when (and (string-match "darwin\\([0-9]+\\)" system-configuration)
(>= (string-to-number (match-string 1 system-configuration)) 11))
;; Built on Mac OS X 10.7 or later.
(let ((spec (font-spec :family "Apple Color Emoji" :registry "iso10646-1")))
(set-fontset-font t nil spec nil 'append)
;; Work around lots of font lookups in emoji compositions.
(set-fontset-font t #xFE0F spec) ; Variation Selector 16
(set-fontset-font t '(#x1F1E6 . #x1F1FF) spec) ; Regional Indicator Syms
(set-fontset-font t '(#x1F3FB . #x1F3FF) spec))) ; Emoji Modifiers
There is another reason for assigning an Emoji font to VS16. I'll
explain it later.
The Mac port also extended composition-function-table so the
composition rule can be a 4-element vector as well as the usual
3-element one:
@@ -1966,7 +2012,8 @@ syms_of_composite (void)
a function to call to compose that character.
The element at index C in the table, if non-nil, is a list of
-composition rules of this form: ([PATTERN PREV-CHARS FUNC] ...)
+composition rules where each rule is a vector of the form [PATTERN
+PREV-CHARS FUNC] or [PATTERN PREV-CHARS FUNC FONT-POS].
PATTERN is a regular expression which C and the surrounding
characters must match.
@@ -1983,6 +2030,10 @@ syms_of_composite (void)
composition of the characters that match PATTERN. It is
called with one argument GSTRING.
+FONT-POS is an integer specifying the position of the character from
+which the font object passed to FUNC as a part of GSTRING is obtained.
+The value is relative to the position of C.
+
GSTRING is a template of a glyph-string to return. It is already
filled with a proper header for the characters to compose, and
glyphs corresponding to those characters one by one. The
The value of FONT-POS is 0 for the entry for VS16, so the font for
VS16, which is explicitly set to "Apple Color Emoji" as above, is used
even if the font for the character preceeding VS16 is in text style.
(set-char-table-range
composition-function-table ?\uFE0F
`([,regexp-keycap 1 mac-compose-gstring-for-variation-with-trailer 0]
[,regexp-modified 1 mac-compose-gstring-for-variation-with-trailer 0]
[,regexp-all 1 mac-compose-gstring-for-emoji-style-variation 0])))
(See https://bitbucket.org/mituharu/emacs-mac/src/83969d9b8c3f093341c294f0dfbe6dd98e58f70c/lisp/term/mac-win.el
for the full code.)
For VS15, the FONT-POS value is either 1 (so the font for U+20E3 is
used for the keycap cases such as U+0023 U+FE0E U+20E3) or -1 (for
non-keycap cases):
(set-char-table-range
composition-function-table ?\uFE0E
`([,regexp-keycap 1 mac-compose-gstring-for-variation-with-trailer 1]
[,regexp-modified 1 mac-compose-gstring-for-variation-with-trailer -1]
[,regexp-all 1 mac-compose-gstring-for-text-style-variation -1]))
Attached is a sample screenshot.
YAMAMOTO Mitsuharu
mituharu@math.s.chiba-u.ac.jp
[-- Attachment #2: VS15and16.png --]
[-- Type: image/png, Size: 110925 bytes --]
^ permalink raw reply [flat|nested] 45+ messages in thread
end of thread, other threads:[~2020-03-22 5:18 UTC | newest]
Thread overview: 45+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20200229173124.11831.98476@vcs0.savannah.gnu.org>
[not found] ` <20200229173125.E2D3A21167@vcs0.savannah.gnu.org>
2020-03-02 10:40 ` emacs-27 60c84ad: ; * etc/TODO: Fix last change Robert Pluim
2020-03-02 11:36 ` Eli Zaretskii
2020-03-02 14:08 ` Robert Pluim
2020-03-02 14:24 ` Eli Zaretskii
2020-03-02 14:36 ` Eli Zaretskii
2020-03-02 15:06 ` Robert Pluim
2020-03-02 15:25 ` Eli Zaretskii
2020-03-02 15:42 ` Robert Pluim
2020-03-02 15:58 ` Eli Zaretskii
2020-03-02 16:40 ` Robert Pluim
2020-03-02 15:34 ` Eli Zaretskii
2020-03-02 16:58 ` Stefan Monnier
2020-03-02 20:12 ` Robert Pluim
2020-03-02 20:21 ` Eli Zaretskii
2020-03-02 20:55 ` Robert Pluim
2020-03-03 12:51 ` Robert Pluim
2020-03-03 16:06 ` Eli Zaretskii
2020-03-04 7:23 ` Robert Pluim
2020-03-04 9:25 ` Robert Pluim
2020-03-04 16:04 ` Eli Zaretskii
2020-03-04 16:54 ` Robert Pluim
2020-03-04 17:19 ` Eli Zaretskii
2020-03-05 7:29 ` Robert Pluim
2020-03-05 7:56 ` Eli Zaretskii
2020-03-05 8:13 ` Robert Pluim
2020-03-05 9:38 ` Eli Zaretskii
2020-03-05 9:48 ` Robert Pluim
2020-03-05 9:53 ` Eli Zaretskii
2020-03-05 14:46 ` Robert Pluim
2020-03-05 14:59 ` Eli Zaretskii
2020-03-05 15:11 ` Robert Pluim
2020-03-05 15:24 ` Eli Zaretskii
2020-03-05 16:08 ` Robert Pluim
2020-03-05 19:04 ` Eli Zaretskii
2020-03-06 16:32 ` Robert Pluim
2020-03-06 17:05 ` Eli Zaretskii
2020-03-06 17:35 ` Robert Pluim
2020-03-09 23:12 ` chad
2020-03-10 7:33 ` Robert Pluim
2020-03-22 5:18 ` YAMAMOTO Mitsuharu
2020-03-04 15:51 ` Eli Zaretskii
2020-03-04 16:58 ` Robert Pluim
2020-03-04 17:24 ` Eli Zaretskii
2020-03-03 17:22 ` Eli Zaretskii
2020-03-04 7:26 ` Robert Pluim
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).