FIELD NOTES: 書を持って街へ出よう

合同会社フィールドワークス プログラマ兼代表のブログ

IPAmj明朝フォントの研究

独立行政法人情報処理推進機構IPA)より「IPAmj明朝フォント」が公開され,6万字というインパクトもあり,各所で注目されているようです。

弊社で開発している「PDF帳票開発ツール Field Reports」でもこのフォントが自由に使えるようになれば,利便性が高まりそうです。どうやったらこの6万字をフルに活用できるのか,調べてみました。

文字コレクション

IPAのプレス発表にも書いてあるとおり,このフォントは行政機関向け(もっと言えば人名用)に作成されたフォントです。

 氏名には多様な漢字が使われており、国、地方公共団体等の行政機関では、情報システムで適切に氏名を扱うために、コンピューターに標準搭載されていない文字を外字として作成するなど、正しく氏名を表記するための様々な取り組みを行ってきました。しかし、氏名を正確に表記したいという要望がある一方で、外字の作成や管理の手間などが、大きな課題となっていました。
 そこでIPAでは、経済産業省委託事業「文字情報基盤構築に関する研究開発事業」において、行政機関の情報システムで、人名等の漢字を効率的に扱う基盤のあり方について検討するとともに、各組織での共通基盤として利用可能な文字フォントの作成を行い、IPAmj明朝フォントの検証版として公開しました。

通常,メイリオヒラギノなどの汎用目的に作成されたフォントはJIS2004Adobe-Japan1などの文字コレクションにもとづいていますが,IPAmjフォントは「戸籍統一文字」「住民基本台帳ネットワークシステム統一文字」をベースとした以下の文字が収録されています。
* 戸籍統一文字(55,267字)
* 住民基本台帳ネットワーク システム統一文字(19,432字)
* JIS漢字コード(10,050字)
* 常用漢字(2,136字)

ただ,第一水準〜第四水準の文字数の合計と一致するので,「JIS漢字コード(10,050字)」はJIS 2004に対応していると考えられます。
汎用目的に使用しても特に問題はなさそうに思えます。

上記を全て包含する 漢字58712 文字 +かな+欧文文字+記号類 = 約6万字。正確には60,718字が収録されています。OpenTypeフォントの仕様上の限界が6,5536字なので,限界近くまで収録されていることがわかります。

符号化

http://ossipedia.ipa.go.jp/ipamjfont/mjmojiichiran/index.html で文字情報の一覧表を見ることができます。

58,712字の漢字のうちUnicodeが割り当てられている(「UCS実装」に○が付いている)文字は49,278字であり,残りの9,434文字はUnicodeが割り当てられていません。
その他,JISに属してる文字は「句点番号」,戸籍統一文字は「戸籍統一文字番号」,住民基本台帳ネットワークシステム統一文字は「住基ネット統一文字コード」といったようにそれぞれ文字コレクションでのコードが併記されていますが,いずれもすべてをカバーすることができません。

そこでIPAでは,"MJ"+6桁数字で表記される「MJ文字図形名」というコードを定義してグリフを管理しているようです。

グリフの呼び出し方

では,この6万字をフルに活用するためにはどうすればよいでしょうか?

Unicodeによるグリフ指定

現在のコンピュータでIPAmj明朝フォントを利用するには,Unicodeを使用するのが便利です。
ただし,Unicode 1.0時代の1文字=16ビットという素朴な仕様で利用できる範囲を超えていますので,49,278字を利用するには以下の仕様に対応したOSやアプリケーションが必要になります。

UTF16で21ビットのコードを表現するには2文字分必要になりますので,これを「サロゲートペア」と呼びます。
UCS実装済みの文字については,Unicodeで直接よびだすことができます。

異体字セレクタ(IVS)」とは,例えば渡邊の「邊」のように復数の字形を持つ文字において「基底文字+異体字セレクタ」の組み合わせでグリフを区別する方法です。IPAmj明朝フォントでは,4,193字にIVSが割り当てられています。
例えば,異体字が多いことで有名な渡邊の「邊」に対応する文字は「文字情報一覧表」に16文字あります。このうち,「IVS実装」に「○」が付いている15文字については異体字セレクタを使って区別して呼び出すことができます。
f:id:fet:20111212115840p:image:w640

GIDによるグリフ指定

UCSが未実装かつIVS実装されていない残りの7,1617,160文字を呼び出すためには,Unicode以外の方法を使う必要があります。次に考えられるのは,GIDを直接使ってグリフを指定する方法です。GIDというのは,TrueType内部でのグリフの管理番号であり,0〜65,535の整数値が割り当てられます。

ただ,GIDは内部管理番号なのでフォントにより体系が異なります。
PostScript系のCIDフォントであれば,アドビが“Adobe-Japan1”で定義したCIDにより指定することができますが,TrueType系のフォントはグリフとGIDの対応表が公開されていなければ実質使えません。また,Adobe-Japan1に準拠しているわけではないので,CIDと対応付けるのも無理な話です。

また,残念ながら「文字情報一覧表」にはGIDは記載されていません。
技術的にはGIDとグリフの一覧をダンプすることも可能ですが,検索するのが大変そうです(実用にならないでしょう)。
UCS未実装の9,434字かつIVS実装の7,160文字は実質利用することができないのでしょうか?

グリフ名によるグリフ指定

そこでIPAに問い合わせてみたところ,有力な情報を教えて頂けました。
TrueTypeフォントファイルの“post”テーブルに「グリフ名」とGIDの対応表が収納されているとのことです。

postテーブルは,PostScript系フォントの互換のために残されているテーブルという頭があったので盲点でした。
試しにpostテーブルをダンプしてみると,確かに全グリフ分のグリフ名が収録されていました。以下に,Apple社が配布している「The Apple Font Tool Suite」を使ってpostテーブルをダンプした結果の一部を示します。グリフ名はMJ文字図形名に対応した「"mj"(小文字)+6桁数字」となっています。

                <PostScriptName glyphRefID="3160" NameString="mj001194" />
                <PostScriptName glyphRefID="3161" NameString="mj001195" />
                <PostScriptName glyphRefID="3162" NameString="mj001196" />
                <PostScriptName glyphRefID="3163" NameString="mj001197" />
                <PostScriptName glyphRefID="3164" NameString="mj001198" />
                <PostScriptName glyphRefID="3165" NameString="mj001199" />
                <PostScriptName glyphRefID="3166" NameString="mj001200" />
                <PostScriptName glyphRefID="3167" NameString="mj001202" />
                <PostScriptName glyphRefID="3168" NameString="mj001203" />
                <PostScriptName glyphRefID="3169" NameString="mj001204" />
                <PostScriptName glyphRefID="3170" NameString="mj001205" />
                <PostScriptName glyphRefID="3171" NameString="mj001206" />
                <PostScriptName glyphRefID="3172" NameString="mj001207" />
                <PostScriptName glyphRefID="3173" NameString="mj001208" />
                <PostScriptName glyphRefID="3174" NameString="mj001209" />
                <PostScriptName glyphRefID="3175" NameString="mj001210" />
                <PostScriptName glyphRefID="3176" NameString="mj001211" />
                <PostScriptName glyphRefID="3177" NameString="mj001212" />
                <PostScriptName glyphRefID="3178" NameString="mj001213" />

アプリケーションにグリフ名で文字を呼び出す機能があれば,IPAmj明朝フォントのすべてのグリフを活用できそうです。

Field Reportsでの対応

以上の調査結果を元に,現在開発中のPDF帳票開発ツールField Reports 1.4では,以下の機能を盛り込む予定です。
これだけ用意しておけば,IPAmj明朝フォント以外の多くのグリフを収録したフォントでも利用できるのではないでしょうか?

  • 21ビットコードポイント(サロゲートペア)対応
  • 異体字セレクタ対応
  • GID/CIDによるグリフ指定
  • グリフ名によるグリフ指定
  • PDFへのフォントの埋込
2011.12.19 追記

Field Reports 1.4では,実体参照風の書式によりグリフ名参照ができるようになりました。

    &@<グリフ名>;