JIS X 4081の文字コードをUTF-8にしたvariantの案およびその実装例。
JIS X 4081は少なくとも日本語の辞書を扱う限りにおいてはよくできているとは思いますが、収録可能な文字がJIS X 0208の範囲内というのは悲しいので無理矢理ユニコードを収録してみました。
JIS X 4081からあまりに乖離するとベースにする意味がなくなるので、最小限度の拡張を心がけています。 機能を追加するのが面倒ともいいます。
テキストおよび検索語を従来のJIS X 0208に変えてUTF-8で収録を行います。
CATALOGSファイルやHONMONファイルの構造等はJIS X 4081 / EPWINGとある程度互換性を持っています。 この為、未対応のツールでアクセスした場合には、テキストやインデックスが存在しない書籍として扱われ、致命的なエラーを起こしにくくしています。
基本的にはJIS X 4081 / EPWINGの実装に従いますので、以下はその差異について記述しています。
CATALOGSファイルに記すEPWINGのバージョン (CATALOGSファイルの4バイト目) を10 (0x0A) とします。 既存のツールへの対策として、書籍のタイトルについては従来通りJIS X 0208で記述します。
従来に変わってテキストをUTF-8で収録するインデックス・テキストとして、以下の書籍構成要素のIDを定義します。
0xC0 本文
0xC1 メニュー
0xC2 著作権情報
0xC4 前方一致表記見出し
0xC5 後方一致表記見出し
0xC6 前方一致表記インデックス
0xC7 後方一致表記インデックス
0xC8 条件検索インデックス
0xCb 正規化テーブル (後述)
本文・メニュー・著作権情報に使用するテキストはUTF-8を使用します。 この為、1文字は1~4バイトの可変長な文字列で表現されます。 U+001F以下の文字は使用しません。 特に0x1Fで始まるバイト列は記述子として予約されているので注意が必要です。
JIS X 4081 / EPWINGの記述子をそのまま使用します。
JIS X 4081での方法ではUTF-8文字とは共存できない為、記述子を用いて表現します。 半角外字は0x1F 0xD0 0xXX 0xYY、全角外字は0x1F 0xD1 0xXX 0xYYとします。 0xXX 0xYYはEPWINGで実装されている外字の指定方法に従って外字を指定します。 つまり、0xXX 0xYYはそれぞれ0xA1-0xFE, 0x21-0x7Eの値となります。
インデックスに登録する検索語は、単純な文字から文字列への置き換えのテーブルによって正規化を行います。 また、書籍を作成するソフトは作成時に用いたテーブルを書籍に収録します。 正規化のアルゴリズムの概略は以下の通りとなります。
検索語からU+0000~U+0020の文字を取り除く。
テーブルに従って文字列を置換する。
置換の結果、検索語が0文字になった場合はU+0000~U+0020の文字を削除した時点の文字列を検索語とする。
後方一致検索時には (バイト単位ではなく) 文字単位で検索語を逆順にする。
検索語が255バイトを超える場合は、超えないように (バイト単位ではなく) 文字単位で切り詰める。
書籍作成時に使用したテーブルをHONMONファイルに埋め込みます。 テーブルの内容は以下の通りです。 (数値は全てビッグエンディアン。)
4バイト テーブル書式のバージョン 現在は1のみ。
4バイト 要素数
nバイト 要素。"置換前の文字列" + "置換後の文字列" + '\0' を要素数分くり返す。
かなインデックス・クロス検索・複合検索等の現在未実装の機能に関する検討。
正規化テーブルの改善。
FreePWINGを改造してUTF-8対応にしたもの。
EB Libraryを改造してUTF-8対応にしたもの。
2009/04/21 公開。