PHPでotfファイルからUnicodeを抽出する
https://github.com/PhenX/php-font-lib
こちらのライブラリでいい感じに抽出が出来そうでした。
ただ、OpenTypeについてある程度理解が無いと厳しそうだったので
adobeとmicrosoft(とappleのTrueType)のfontのドキュメントも合わせて読んでみました。
http://www.adobe.com/devnet/font.html
http://www.microsoft.com/typography/otspec/
https://developer.apple.com/fonts/ttrefman/
フォントファイルはいわゆるバイナリなので、フォーマットの中身を調べていけば分かるはずなのですが、
ドキュメントの解読だけではUnicodeの割り当てまでたどり着けなかったので
上記のライブラリの実装と見比べて、調査する形になりました。
フォーマット全ては把握しきれませんでしたが、Unicodeの割り当てには
glyphIndexArrayというattributeが該当するようです。
glyphIndexArrayについての説明は以下のドキュメントにありました。
https://developer.apple.com/fonts/ttrefman/RM06/Chap6cmap.html
コードとしては、上記ライブラリのwww/font_info.php内でUnicodeの抽出と実体参照による描画をやっている箇所がありました。
cmapのテーブルからMicrosoft用のUnicode(BMP)に当たるglyphIndexArrayを抽出して
HTMLで可視化しているようです。
さきのドキュメントを調べた限りでは、BMP以外も別テーブルにあるようなので
全てを抽出するには、複数のテーブル(PlatoFormIDとPlatformSpecificIDの組み合わせ)を調べる必要がありそうです。
おまけ
OpenTypeについて、ざっくりと説明すると、CIDと呼ばれる独自のIDに文字(字面)を割り当て
CID毎にUnicodeをマッピングしておくことで、アプリケーションから文字を使用出来るようになっています。
何故Unicodeそのままではない独自の形なのかと言うと、異体字の扱いが絡んでいるためとのこと。
(異体字はUnicodeは同じコードが割り当てられるため、文字の出し分けが出来ない)
また、このCIDと字面の割り当て方は、幾つかの仕様があるのですが
今回、自分が必要になったのはAdobe-Japan1-4という日本語を割り当てるための仕様の一つでした。
だいぶざっくりした調査ですが、メモ書きとして残しておきます。