CJK互換漢字について

昨日 Relaxed Typing Mono JP というフォントについて記事を書きました。

Github のプロジェクトページでフォント生成スクリプトを確認すると、compat_map.py というやたらと長い dictionary があります。これが何なのか、もしピンとくる方がいらっしゃるなら、かなり Unicode に詳しい方ではないでしょうか。

CJK 互換漢字のリストが必要なわけ

この長大な dictionary は「CJK 互換漢字(CJK Compatibility Ideographs)」のリストです。文字コードには、いろいろ思わぬ点があり、同じ字形に対して複数の文字コードが割り振られている場合があります。この互換漢字はそのひとつです。

Relaxed Typing Mono JP の合成元である Noto Sans JP は CID フォントですが、各グリフには Unicode 値も振られています。しかし、この値が互換漢字のほうの値で振られている場合もあるようです。CID フォントについて詳しいわけではないので、これが Noto Sans JP に固有のことなのかはわかりませんが、今回のケースでは、この変換マップが必要になりました(実質的には、ここまで長い dictionary である必要はなかったかもしれませんが、機械的につくったものですので)。

同じ字形に異なるコード値が割り振られているとは

CJK 互換漢字について、ざっとした説明を書きましたが、ざっとしすぎたきらいがあるので、具体例も紹介しておきたいと思います。 同じ字形に異なるコード値が振られているとはどういうことか、たとえば U+FA04 は、CJK 互換漢字のブロックに含まれる文字ですが、これは U+5B85 と互換関係にあるということです。つまり、

$ python
>>> print(u"\uFA04")
宅
>>> print(u"\u5B85")
宅

ということです。つまり、「宅」という字形を示すコード値は、ふつうは U+5B85 ですが、この字は互換漢字の対象なので U+FA04 のこともないわけではないということです。


同じ字形に異なるコード値の例
同じ字形に異なるコード値の例