gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

異字体?

大本ネタはこちら。
http://moriyoshi.hatenablog.com/entry/2017/03/13/011005
ここで「異体字セレクタ」ってのをはじめて知って、ちょろっと調べものをしたので、備忘録的に。
UnicodeっつかUTF-8で「1文字づつ」に分割するごにょごにょを書きたいかもなぁ、とか、ちょろっと妄想をしていたので。


とりあえず。

(二点しんにょう U+8FBB + VS18) ⇔「辻??」(一点しんにょう U+8FBB + VS17)

……ふお?
U+8FBB はわかるんだが、 + VS18、って、なにかしらん?
が、startライン。


http://itpro.nikkeibp.co.jp/article/COLUMN/20110124/356398/?rt=nocnt
見ると、「E9 82 8A F3 A0 84 80」とか「E9 82 8A F3 A0 84 81」とか。


念の為に、UTF-8エンコーディング方法を確認。
https://ja.wikipedia.org/wiki/UTF-8
………ぶも?
5バイト長とか6バイト長とかある???
一端より道して調べもの。…いやもしあるんなら。MySQLのutf8mb4が、些か、怖いやもしれぬので。


https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7%E8%A1%A8
http://www.unicode.org/roadmaps/


ふむ。第16面でも「U+F0000 〜 U+10FFFF」なのねん。
これだと十分に4バイトで入る。…5バイト長とか6バイト長は「将来に向けての布石」なのかしらん?
とりあえず「当面の厄介」は消えたぽいので、「5バイト長とか6バイト長」の調査は一端ここで打ち切り。


もどして…とりあえず、ビット列に分解して、有効な値を取り出してみる。


E9 82 8A F3 A0 84 80
1110 1001 1000 0010 1000 1010 1111 0011 1010 0000 1000 0100 1000 0000


E9 82 8A F3 A0 84 81
1110 1001 1000 0010 1000 1010 1111 0011 1010 0000 1000 0100 1000 0001


使う子だけ、はじき出す…とりあえず先頭は多分3バイトのはず。
1110 yyyy 10yx xxxx 10xx xxxx
1110 1001 1000 0010 1000 1010 1111 0011 1010 0000 1000 0100 1000 0000
1110 1001 1000 0010 1000 1010 1111 0011 1010 0000 1000 0100 1000 0001


どっちも
1001000010001010
908A


うん確かに「邊」の字だ。
てことは手前3バイトは文字なんだ…後ろの4バイトを解析してみませう。
先頭が11110なんで、UTF-8的には「4バイト文字」のはず。


1111 0yyy 10yy xxxx 10xx xxxx 10xx xxxx
1111 0011 1010 0000 1000 0100 1000 0000
1111 0011 1010 0000 1000 0100 1000 0001


011100000000100000000
011100000000100000001


E0100
E0101


一覧を見てみる…
https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_E0000-E0FFF
「VS17」とか「VS18」とか。


あぁ!!
単純に、ここらへん(おそらく、E0100〜E01E0F)までは「異字体(IVS:Ideographic Variation Sequence)だよ!!」って取決めなのか!!
うん、腑に落ちた。


ってことは「1文字を切り出す」時に、もし後ろにこの子がいたら「前の字とセットで」持っておいてあげる必要があるんだなぁ。
PHPの実装とかどうなってるんだろ?
まぁその辺はまた後日、気になったら調べてみませうw