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という日本語を割り当てるための仕様の一つでした。

http://wwwimages.adobe.com/www.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5078.Adobe-Japan1-6.pdf

だいぶざっくりした調査ですが、メモ書きとして残しておきます。


created by
koji_magi
created at
last modified by
koji_magi
last modified at
2013-11-10 09:32
comments powered by Disqus