旧漢字の問題は解決していませんでした

Relaxed Typing Mono JP を更新しましたと前回お知らせしたときに、一部が「旧漢字」の字体になっていたのを解決しましたと書きました。しかし、問題が解消されたはずのバージョン 1.03 をインストールしてみると問題は何も変わっていません。そこで、改めて調査して一定の対処をし、バージョン 1.04 をリリースしました。ドタバタですね、うむむ、と振り返りたくなるところです。

直接の原因

1.03 のとき、この問題は CID のマッピングが関係しているのではないかと推測していました。しかし、問題を引き起こしていた直接の原因は compat_map.py にありました。 この変換マップは、CJK 互換漢字のマップです。Noto Sans JP の一部の漢字が本来の文字コードではなく、互換漢字のほうのコードになってしまっていたので、互換漢字のコードを互換元(という表現でいいのかな?)のほうのコードに変換するためにこれを使っていました。つまり、ここで対処したかったケースは、互換漢字のコードに割り振られた字体は存在するが、その互換元のコードに割り振られた字体が存在しないケースです。 ところが、CJK 互換漢字には新漢字と旧漢字の互換情報も含まれていました。今回のケースでは、旧漢字(つまり互換漢字)のコードにも、新漢字(互換元)のコードにも字体が割り振られていたケースで、先に新漢字の字体をペーストしたにもかかわらず、あとから旧漢字の字体も同じコードに上書きしてしまっていたというわけです。

なぜ解決したと思ったのか……

otf2ttf が問題を解消してくれたみたいだ、と思い込んでいたのですが、これは、実際にフォントキャッシュを消しながらレンダリング結果を目視して、問題の解消を確認していたからです。この目視確認に実は勘違いがあったということになります。 問題が発生している原因を論理的に明らかにせず当て推量で済ませてしまったので、こういう勘違いにひっかかってしまったということになるでしょうか。そう追究せずとも結果オーライで問題ないケースもありますし、それには時間的メリットもあるわけですが、しかしそれではやはり確度に問題が出てしまうということにはなりそうです……。このスクリプトは 1.04 で一定の対処はしましたが、また時間ができたらユニコードの調査をしつつ改めて見直してみたいです。