Yabu.log

ITなどの雑記

結合絵文字をバイナリダンプして検証

turingcomplete.fmの12回で結合絵文字を扱うのが大変という話を聞いたので調べてみました。

turingcomplete.fm

家族(👨‍👩‍👧‍👦)のような絵文字は、文字コードとしてはそれ一つが独立した絵文字ではなく、 お父さん、お母さん、娘、息子の絵文字の連結として扱っているらしい。こういう絵文字のことを結合絵文字というらしい。興味が出てきたのでバイナリダンプして本当に複数の文字の結合として表されているのか検証してみました。

Codepoints
👨 U+1F468
‍ U+200D
👩 U+1F469
‍ U+200D
👧 U+1F467
‍ U+200D
👦 U+1F466

iOS Emoji

utf8の対応
👨F09F91A8
👩F09F91A9
👧F09F91A7
👦F09F91A6
$ echo '👨‍👩‍👧‍👦' | xxd -b
00000000: 11110000 10011111 10010001 10101000 11100010 10000000  ......
00000006: 10001101 11110000 10011111 10010001 10101001 11100010  ......
0000000c: 10000000 10001101 11110000 10011111 10010001 10100111  ......
00000012: 11100010 10000000 10001101 11110000 10011111 10010001  ......
00000018: 10100110 00001010                                      ..

$  echo '👨‍👩‍👧‍👦' |  od -t x1
0000000    f0  9f  91  a8  e2  80  8d  f0  9f  91  a9  e2  80  8d  f0  9f
0000020    91  a7  e2  80  8d  f0  9f  91  a6  0a 


$  echo '👨👩👧👦' | od -t x1
0000000    f0  9f  91  a8  f0  9f  91  a9  f0  9f  91  a7  f0  9f  91  a6
0000020    0a                                                            


$ echo '👨' | od -t x1
0000000    f0  9f  91  a8  0a 

$ echo '👩' | od -t x1
0000000    f0  9f  91  a9  0a                                            

$  echo '👧' |  od -t x1
0000000    f0  9f  91  a7  0a                           

$ echo '👦' | od -t x1
0000000    f0  9f  91  a6  0a 

空白文字(連結文字?)はこちらのサイトをみるとe2808dのようです

Unicode Character 'ZERO WIDTH JOINER' (U+200D)

空白 E2808D
👨 F09F91A8
👩 F09F91A9
👧 F09F91A7
👦 F09F91A6

青=お父さん、赤=お母さん、ピンク=娘、水色=息子で塗ってみました。

バイナリ版

16進版

データのバイナリダンプはあまりやったことがないので手こずりましたが、結合絵文字がどんな風に表現されているのかは検証することができました。

余談

参考

@ruiさんに直接教えていただいた内容を参考に投稿を書き直しました。 odを適当に使ってて*1エンディアンがどうこうで混乱していたので非常に助かります。ありがとうございました。

*1:manを見直したけどなんでエンディアンの反転が起こっていたのかよくわからない