フォントに入っているグリフを調べる

パッケージ製品開発担当の大です。こんにちは。
今回はフォントの話です。

フォントに入っているグリフ

フォントに入っているグリフ(クリックで拡大)

使いたい文字のグリフがあるフォントに入っているかどうかは、普通にパソコンを使っているとあまり意識しません。これは、フォントのフォールバック機構がOSにあるためです。使用中のフォントにグリフが存在しない文字が指定されたら、OSがフォールバックに指定されているフォントから見つけてきて補完してくれます。Windowsでは「フォントリンク」というもので実現されています。(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink\Meiryo の値を表示しています。)

Windows 10のメイリオのフォントリンク

Windows 10のメイリオのフォントリンク(クリックで拡大)

とても便利なのですが、逆に実際にそのフォントにグリフが入っているかどうかがわかりにくいという欠点もあります。例として、CJK統合漢字の「俞(U+4FDE)」をMSのIMEパッドで見てみると、一見このグリフがメイリオに入っているように見えます。メモ帳などで指定してみてもきちんと表示できます。

MS IMEパッドでU+4FDEを見る

MS IMEパッドでU+4FDEを見る(クリックで拡大)

ところが実際にはこのグリフはメイリオには入っていないので、たとえばPDFでメイリオフォントを埋め込みにして作成しても、この文字は表示されません。PDFのフォント埋め込みは、OS等に依存せず別の環境に持って行ったときにも同じように表示されることを目的としていますから、当然といえば当然なのですが、困ってしまいますね。

あるグリフが指定したフォントに入っているか調べるツールとして、Windowsには「文字コード表」が入っています。先ほどのU+4FDEは、

文字コード表でU+4FDEを見る

文字コード表でU+4FDEを見る(クリックで拡大)

図のように、「保(U+4FDD)」の次に「俟(U+4FDF)」が来ていることから、メイリオには存在しないことがわかります。わかりますけど……!わかりにくいですね。おまけに文字コード表は基本他言語面(BMP)にしか対応していないため、追加他言語面(SMP)の文字については調べられません。

代替手段として、Javaがインストールされていれば、コマンドラインで %JRE_HOME%¥bin¥jjs.exe を起動して、以下のように入力すれば、調べることができます。

C:\>"C:\Program Files\Java\jre1.8.0_102\bin\jjs.exe"
jjs> new java.awt.Font('メイリオ', 0, 12).canDisplay(0x4FDE)
false
jjs> new java.awt.Font('Microsoft YaHei', 0, 12).canDisplay(0x4FDE)
true

メイリオにはU+4FDEが含まれていないためfalseになりますが、「Microsoft YaHei」には含まれているのでtrueになりますね。

ワンライナーでやるならJDKのjrunscript.exeで同じことができます。

C:\>"C:\Program Files\Java\jdk1.8.0_102\bin\jrunscript.exe" -e "print(new java.awt.Font('メイリオ', 
0, 12).canDisplay(0x4FDE))"
false

C:\>"C:\Program Files\Java\jdk1.8.0_102\bin\jrunscript.exe" -e "print(new java.awt.Font('Microsoft 
YaHei', 0, 12).canDisplay(0x4FDE))"
true

1文字だけ調べたいならこれでいいんですけど、調べたい文字がたくさんだったらやっぱり一覧したいですね。

なので、さくっと作ってみました。

メイリオのU+4FDEは存在しない

メイリオのU+4FDEは存在しない(クリックで拡大)

存在しない文字は空で表示するようにしました。メイリオのU+4FDEは存在しないことが一目でわかりますね!

Microsoft YaHeiのU+4FDEは存在する

Microsoft YaHeiのU+4FDEは存在する(クリックで拡大)

Microsoft YaHeiだと文字が入ってます。

「Segoe UI Emoji」の絵文字も、「文字コード表」だと「㊙(U+3299)」までしか調べられませんが、

Segoe UI Emoji

Segoe UI Emoji(クリックで拡大)

U+1Fxxx番台のものもちゃんと見れます。ちなみに「Apple Color Emoji」の絵文字だと

Apple Color Emoji

Apple Color Emoji(クリックで拡大)

ちゃんとカラーになりました(特に制御しているわけではなく、JavaFXで普通にTableViewに流し込んでいるだけですが、Segoe UI Emojiはモノクロ、Apple Color Emojiはカラーで表示されます。Segoe UI Emojiもカラーの情報を持っているはずなんですけどね。OSによる違い?)。

作成した一覧表示用のツールはこちらです。Java8が入っていれば、jarをダブルクリックして起動できると思います。

ソースも適当ですが置いときます。NetBeansで開いてビルドしてください。