System i の外字は 文字作成ユーティリティー (CGU) でドット単位で指定して作成することは
良く知られている。
それでは登録した外字は、どこに保存されているのだろうか ?
STRCGU
で作成されるのは 24x24ドットの外字と 32x32ドットの外字の2種類があり、
24x24ドットの外字は QIGC2424 *IGCTBL
という漢字テーブルに保存されており、
32x32ドットの外字は QIGC3232 *IGCTBL
という漢字テーブルに保存されている。
*IGCTBL
、つまり漢字テーブルというオブジェクトは、直接、その中身を参照するための
コマンドやAPI も用意されていない。つまり中身は一切、知ることができない。
この System i に外字があるかどうかだけは CHKIGCTBL
コマンドによって
CHKOBJ
コマンドのようにして検査することができる。
ただし CHKIGCTBL コマンドも CHKOBJ コマンド以上の機能はない。
唯一、CPYIGCTBL
(DBCSフォント・テーブル の コピー) というコマンドによって
漢字テーブルを物理ファイルにコピーしたり、物理ファイルから漢字テーブルに
コピーしたりすることができる。
さて、CPYIGCTBL
を使うにも
がわからないと CPYIGCTBL をどのようにして利用すればよいかは不明である。
実は IBM は CPYIGCTBL コマンドはテープ等の媒体にBACKUP としてコピーしておいて
後で BACKUP から戻すような使途しか想定していなかったらしくて CPYIGCTBL の相手となる
物理ファイルの解説が全くない。
そこでここでは *IGCTBL
が変換された物理ファイルのレイアウトについて紹介しよう。
まず
フォント・サイズ | 24x24 | 32x32 |
---|---|---|
レコード長 | 74 バイト | 130 バイト |
の物理ファイルを次のようにして作成する。
CRTPF FILE(QTEMP/QIGC2424) RCDLEN(74) MBR(GAIJI) IGCDTA(*YES) LVLCHK(*NO) AUT(*ALL) または CRTPF FILE(QTEMP/QIGC3232) RCDLEN(130) MBR(GAIJI) IGCDTA(*YES) LVLCHK(*NO) AUT(*ALL)
【注】 MEMOREX 社がPDF で CPYIGCTBL の使い方を詳しく紹介している。
iSeries400(AS/400)外字印刷(PDF) ※外部リンク
次に物理ファイルのレイアウトは次のように構成されている。
24x24ドットの外字の場合
32x32 ドットの外字の場合
ところで 24x24 のイメージ・データであれば 24x24=576 バイトが必要であるはずだし、
32x32 のイメージ・データであれば 32x32=1024 バイトが必要であるはずである。
なぜ各々は 70バイトと128バイトと短いのだろうか ?
これには理由がある。
これはビットマップ独自の圧縮方法によって約1/8に圧縮されているので小さなサイズで済んでいるのである。
ただしこのイメージ・データは通常のビットマップと全く同じというわけではなく、
実際のビットマップにするには下から上へとビットマップに記述したり補数を計算したり等々、
結構面倒な作業を必要とする。
この図のように外字(ユーザー選定漢字)域は 0x6941
から始まって 0x73EA
までの
文字である。
定義可能な外字の総数は IBM マニュアルを参照しても様々であり、
日本語環境であれば 最高4370字登録可能 であると書かれていたりするが、
一般には 1880文字 とされているが上記の図より計算してみると
190 * 9 + 170 = 1880 文字数分の外字しか定義することができない。
一方で CGU の画面によればユーザー定義可能な外字の漢字番号は 10561-16382 とある。
16382- 10561 + 1 = 5800 文字である。
(図ではわかりにくいが上位ビットは 68
, 69
, 6A
, 6B
, 6C
, 6D
, 6E
, 6F
, 70
, 71
, 72
, 73
と続いている)
一体、どれが正しいのであるのか不明だが漢字コード体系が正しいように思える
日本の場合は外字を数百も登録する必要があることはないので今のところ問題とは
ならないが台湾の場合は繁体字であるので種類が多く、特に人名が外字として
かなりの数の登録が必要であるとのことである。
IBM 漢字コード体系はマニュアルでも図解されている例は今ではほとんど見つからないので
あえて、ここでコード体系を紹介した。