JIS X 0208(JIS第一・第二水準)の時代に使うことのできる漢字は7,000字程度でした。
JIS規格にない人名・地名を画面や帳票に出力するためには,外字フォントを自作するしか方法がありませんでした。
戸籍や住民票などで人名を扱う必要のある各地方自治体では,それぞれ独自の外字フォントをメンテナンスしている(いた)という涙ぐましい話も聞こえてきます。
しかし今やJIS規格も第三・第四水準が制定され,OSに標準搭載されているフォントに約2万字が収容される時代になりました。
特に,IPA(独立行政法人情報処理推進機構)が整備しているIPAmj明朝フォントでは,日本の人名で使われるほとんどの漢字を含む約6万字が収容されています。
Field Reportsで,これらの多漢字フォントをフルに活用した帳票を作成するにはどうすれば良いのでしょうか?
Unicode文字列による方法
かな漢字変換
かな漢字変換で入力可能な通常の文字は,MS-IME(Windows),ことえり(Mac OS X)などのかな漢字変換入力のソフトウェアを使って,Unicode文字列として入力します。
文字入力ツール
最近のOSはJIS2004に対応していますが,かな漢字変換の辞書にすべての文字の読みが登録されているとは限りません。辞書に登録されていても読みがわからないことも多いでしょう。かな漢字変換による多漢字入力には限界があります。
コードポイントによる方法
Unicodeに収容されている文字を表現する場合,“U+”にその文字の符号位置を表す16進数の値を続けます。この値をコードポイントと呼びます。
現在のUinocde 2.0 規格は21ビットに拡張されているため,最大6桁のコードポイント(U+0000〜U+10FFFF)で文字を表現することになります。
16ビットの範囲で表現できない文字をUTF-16などの16ビット固定長の文字コードで表現する際に2文字分の領域が必要なことから,「サロゲートペア(代用対)」と呼ぶこともあります。
コードポイントがわかっている文字をプログラミング言語から指定する方法として,エスケープ文字を利用する方法と数値参照文字を利用する方法があります。
エスケープ文字
プログラミング言語によっては,エスケープ文字を使ってUnicodeコードポイントにより文字を表現することができます。
Rubyでは,\uXXXX または \u{XXXX} の形式エスケープ文字が用意されています。
ここでXXXは16進数を表します。 \u{XXXX}形式の場合は,任意の桁数の16進数を使用できます。
Pythonでは,\uXXXXまたは \UXXXXXXXX 形式のエスケープ文字が利用可能です。
JSON形式の外部ファイルを利用する場合は,\uXXXX 形式のエスケープ文字が利用できます。
さらに,Field Reportsの独自拡張として,\UXXXXXXXX 形式も利用可能です。
数値参照文字
エスケープ文字が利用できないプログラミング言語をご利用の場合,数値参照文字が利用できます。
ただし数値参照文字を利用するには,テキストフィールド単位でcharref属性の値をTrueに指定する必要があります。
&#dddd; または &#xhhhh; (ddddは10進数,hhhhは16進数)
グリフ直接指定による方法
フォントが持っているすべての字形(グリフ)にUnicodeが割り当てられているとは限りません。
Field Reportsでは,Unicode未割り当てのグリフを直接指定する手段も用意しています。
GID/CID指定
フォントに収容されているすべての字形(グリフ)には,TrueTypeフォントの場合GID,OpenTypeフォントの場合CIDという内部コードが振られています。
「グリフ参照文字」形式により,GIDまたはCIDによるグリフの直接指定を行うことができます。
&@#dddd; または &@#xhhhh;
グリフ名参照
フォントによっては一つ一つの文字に固有のグリフ名が付けられていることがあります。
グリフ名が使用できる場合には,「グリフ名参照」形式によるグリフの指定が可能です。
&@<グリフ名>;
グリフ名参照が利用できるフォントとしては,IPAフォントがあります。
実行例
以下に,グリフ名参照を使用してPDFを作成した例を示します。
実行には,Field Reports のコマンドラインプログラムを使用しました。 下記のパラメータファイルを作成してコマンドラインプログラムに掛けると,先頭の実行例の様なPDFが作成されます。
なお,サロゲートペアや異体字セレクタとして表現される文字が含まれる場合やグリフを直接参照する場合には, フォントを埋め込む必要があります。
「サロゲートペア」では,Unicode 6.0に含まれるCJK統合漢字拡張漢字B集合~D集合の文字の一部を表示しています。
「異体字セレクタ」では,異体字セレクタを使って「邊」の異体字等を表示しています。
「グリフ名参照文字」では,IPAmj明朝に収納されている文字のうちUCSが未実装かつIVS実装されていない7,160文字の一部を表示しています。
{
"resources": {
"font": {
"IPAmjMincho": {
"src": "../fonts/ipamjm.ttf",
"embed": true,
"subset": true
}
}
},
"template": {"size": "A4"},
"context": {
"text": [
{
"new": "Tx",
"font": "IPAmjMincho",
"font-size": 14,
"rect": [50, 750, 550, 780],
"value": "【サロゲートペア】"
},
{
"new": "Tx",
"font": "IPAmjMincho",
"font-size": 24,
"multiline": true,
"rect": [50, 650, 550, 750],
"charref": true,
"value": "\U0002000B\U00020089\U000200A2\U000200A4𠆢𠈓𠌫𠍱𠎁𠏹𠑊𠔉𠗖𠘨𠝏𠠇𠠺𠢹𠥼𠦝\n𪜖𪜩𪜪𪜬𪜸𪜽𪝆𪝒𪝘𪝟\n𫝀𫝁𫝂𫝃𫝄𫝅𫝆𫝇𫝉𫝊𫝌𫝍"
},
{
"new": "Tx",
"font": "IPAmjMincho",
"font-size": 14,
"rect": [50, 600, 550, 630],
"value": "【異体字セレクタ】"
},
{
"new": "Tx",
"font": "IPAmjMincho",
"font-size": 24,
"multiline": true,
"rect": [50, 500, 550, 600],
"value": "\u9089\U000E010F\u9089\U000E0119\u9089\U000E011B\u9089\U000E011A\u9089\U000E011C\u9089\U000E011D\u9089\U000E0117\u9089\U000E0116\u9089\U000E0115\u9089\U000E0114\u9089\U000E0118\u9089\U000E0113\u9089\U000E0112\u9089\U000E0111\u9089\U000E0110\n\u908A\U000E0108\u908A\U000E0109\u908A\U000E010A\u908A\U000E010B\u908A\U000E010C\u908A\U000E010D\u908A\U000E010E\u908A\U000E010F\u908A\U000E0110\n葛飾区 葛\U000E0102城市/蓮田市 蓮\U000E0104田市"
},
{
"new": "Tx",
"font": "IPAmjMincho",
"font-size": 14,
"rect": [50, 450, 550, 480],
"value": "【グリフ名参照文字】"
},
{
"new": "Tx",
"font": "IPAmjMincho",
"font-size": 24,
"multiline": true,
"rect": [50, 350, 550, 450],
"charref": true,
"value":"&@mj000007;&@mj000008;&@mj000012;&@mj000022;&@mj000023;&@mj000028;&@mj000029;&@mj000036;&@mj000037;&@mj000045;&@mj000046;&@mj000047;&@mj000048;&@mj000073;&@mj000074;&@mj000089;&@mj000105;&@mj000106;&@mj000129;&@mj000130;&@mj000143;&@mj000144;&@mj000145;&@mj000146;&@mj000156;&@mj000157;&@mj000175;&@mj000176;&@mj000183;&@mj000184;&@mj000185;&@mj000206;&@mj000207;&@mj000208;&@mj000209;&@mj000241;&@mj000242;&@mj000264;&@mj000265;&@mj000266;&@mj000267;&@mj000269;&@mj000270;&@mj000276;&@mj000277;&@mj000278;&@mj000302;&@mj000303;&@mj000309;&@mj000310;&@mj000311;&@mj000312;&@mj000317;&@mj000318;&@mj000332;&@mj000333;&@mj000380;&@mj000381;&@mj000405;&@mj000406;"
}
]
}
}