turingcomplete.fmの12回で結合絵文字を扱うのが大変という話を聞いたので調べてみました。
家族(👨👩👧👦)のような絵文字は、文字コードとしてはそれ一つが独立した絵文字ではなく、 お父さん、お母さん、娘、息子の絵文字の連結として扱っているらしい。こういう絵文字のことを結合絵文字というらしい。興味が出てきたのでバイナリダンプして本当に複数の文字の結合として表されているのか検証してみました。
Codepoints 👨 U+1F468 U+200D 👩 U+1F469 U+200D 👧 U+1F467 U+200D 👦 U+1F466
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 |
青=お父さん、赤=お母さん、ピンク=娘、水色=息子で塗ってみました。
データのバイナリダンプはあまりやったことがないので手こずりましたが、結合絵文字がどんな風に表現されているのかは検証することができました。
余談
ちなみに家族絵文字👨👩👦👦をdeleteキーで消すと娘->息子->母->父の順番に消えました pic.twitter.com/momHoMy2lx
— yuyabu (@yuyabu2) 2018年4月3日
参考
@ruiさんに直接教えていただいた内容を参考に投稿を書き直しました。 odを適当に使ってて*1エンディアンがどうこうで混乱していたので非常に助かります。ありがとうございました。
odが4バイト単位で表示しているからわかりにくいですが、実際に入っているバイト列はこれです。 pic.twitter.com/oyajh0wvur
— Rui Ueyama (@rui314) 2018年4月3日