EBStudioにおけるJIS X4081の実装について

六版 2001/4/21
by hishida@bg.mbn.or.jp


 この文書は、「電子書籍・電子書籍作成ツールEBStudio」における、JIS X4081-1996「日本語電子出版検索データ構造」の実装の詳細を解説するものです。想定している読者は、EPWING/電子ブック/JIS X4081形式辞書を用いたアプリケーションの開発者、およびJIS X4081に技術的興味を持つ方全般です。この文書は、読者がJIS X4081-1996「日本語電子出版検索データ構造」を閲覧できることを前提にしています(JIS X4081はJISハンドブック中に収録されています)。

 以下ではC++風の疑似言語でデータ構造を記述しています。項目名は、JIS X4081の仕様に合わせてあります(ただし予備領域のサブメンバは除く)。

データ型 意味
BYTE 8bit整数
WORD 16bit整数(ビッグエンディアン)
LONG 32bit整数(ビッグエンディアン)
BCDn n バイトの二進化十進数

なお、規格の理解の助けとするため、拙作のEBDump.exeによる市販辞書の一部ダンプ出力を掲載することがあります。

JIS X4081の実装について

JIS X4081-1996「日本語電子出版検索データ構造」は、EPWING V1規約を本に作成された日本工業規格であり、統一した操作性で各種の出版物を検索できるように規定されたものです。

「“日本語電子出版検索データ構造”は、(EPWING)コンソーシアムの規約公開を受けて、“EPWING規約”を基本としてまとめたものである。」(同規約より)

しかしながら、具体的な実装方法については定義されていない部分が多く、JIS X4081の情報だけでは、流通しているパソコン用EPWING/電子ブック検索ビューアで検索できる電子書籍は作成できません。このため、EBStudioではJIS X4081に準拠した上で、実装依存の部分の解釈についてはEPWING/電子ブックと互換性を持たせています。具体的には次のような項目についてです。

コンテンツの入力ファイルの準備

 業務用のEPWINGオーサリングツールの多くは、SGMLに代表される構造化マークアップ言語でタグ付けした文書から、EPWINGに変換する手順を取ります。SGMLのような構造化文書の利点は、章・節・段落・索引語などの文章構造を表現することができ、書籍をデータとして処理することができることです。このためメニューの自動作成や、索引の作成等が容易に行えます。また、Webなどの各種電子出版への展開や、データベースの作成など、ワンソース・マルチユースが実現します。

 EBStudioも同様の考え方から、構造化文書からJIS X4081形式へ変換します。ただしSGMLは仕様が複雑で利用が難しいため、インターネットで広く普及しており簡単に作成できるHTMLを採用しています。 また、テキストからのマークアップを簡単に行うために、自動マークアップツール EBTag を提供しています。

今後はSGML/HTMLに代わってXMLが広く使用されることが予想されるため、将来的にはXML対応を進めていきたいと考えています。電子書籍用のDTDにはSGMLの時代からあるTEI、DocBook、ISO12083の他、Open eBookやJepaXなどがあります。現在EBStudioでは、暫定的にJepaXに対応していますが、将来DicXやNetEBなどの辞書系のDTDが普及したときには、対応することもありえます。

HTMLの他に、ネットで公開されている辞書データを簡単に使用するために、英辞郎形式とPDICテキスト形式に標準で対応しています。

なお、EBStudio自身にはコンテンツを編集する機能はありません。別途EBStudioがサポートする入力形式に変換するか、エディタ等を用いて編集する必要があります。

電子書籍のファイル構成

 JIS X4081では、OS上のファイル名等については定義されていません。 EPWING、電子ブックのファイル構成は、次図の通りです。

EPWING

\ ― CATALOGS
書籍ディレクトリ名 ― DATA ― HONMON (書籍ファイル)
GAIJI ― * (外字ファイル)
MOVIE ― *

電子ブック

\ ― CATALOG
書籍ディレクトリ名 ― START (書籍ファイル)

登録書籍名管理ファイル(CATALOGS/CATALOG)

JIS X4081

 登録書籍名管理ファイル ::= 登録書籍数,予備領域1,書籍ファイル管理情報+
 書籍ファイル管理情報 ::= 予備領域2,書籍名称,書籍ディレクトリ名,書籍ファイルディレクトリ位置,書籍管理情報記録位置,予備領域3

 登録書籍名管理ファイルは、媒体のルートディレクトリに一つだけ存在し、 媒体に記録する書籍の情報を管理します。EPWINGではCATALOGS、電子ブックではCATALOGというファイル名です。

 一つの媒体には、複数の書籍を格納できます。ただし書籍ファイル管理情報は1ブロック(2048バイト)内に書き込まれるため、媒体に記録できる書籍数は、EPWINGの場合12、電子ブックの場合50に制限されます。それ以上の書籍を格納したい場合は、一つの書籍ファイルの中に合本の形で入れる必要があります

(1) EPWING(CATALOGS)

疑似コード

	WORD 登録書籍数;	// 媒体に記録される書籍数(最大12)
	struct {
		BYTE dummy;
		BYTE Version;	// EPWINGバージョン番号 
		BYTE dummy[12];
	} 予備領域1;	// (14Bytes)
	struct {
		struct {
			BYTE 書籍の種類;
				// 0x00	国語辞典
				// 0x10	漢和辞典
				// 0x20	英和辞典
				// 0x30	和英辞典
				// 0x40	現代用語辞典
				// 0x50	百科事典
				// 0x60	一般書物
				// 0x70	類語辞典
			BYTE Version;	// EPWINGバージョン番号 
		} 予備領域2;
		BYTE 書籍名称[80];	// JIS X0208を使用、空白は20Hで埋める
		BYTE 書籍ディレクトリ名[8];	// JIS X0201を使用
		LONG 書籍ファイルディレクトリ位置;
			// 再生システムが高速に書籍ファイルの存在位置を獲得する
			// ために実装に依存して記録することができる。
			// 省略するときは 0
		WORD 書籍管理情報記録位置;
			// 書籍ファイルの中の書籍管理情報が記録されている位置。
			// ブロック番号で記録する。通常 1 を記録
		struct {
			BYTE 16X16外字ファイル名[8];	// 全角16ドット
			BYTE 24X24外字ファイル名[8];	// 全角24ドット
			BYTE 30X30外字ファイル名[8];	// 全角30ドット
			BYTE 48X48外字ファイル名[8];	// 全角48ドット
			BYTE  8X16外字ファイル名[8];	// 半角16ドット
			BYTE 12X24外字ファイル名[8];	// 半角24ドット
			BYTE 15X30外字ファイル名[8];	// 半角30ドット
			BYTE 24X48外字ファイル名[8];	// 半角48ドット
			BYTE dummy[4];
		} 予備領域3;	// 実装において定義するための領域(68bytes)
	} 書籍ファイル管理情報[登録書籍数];	// (164 bytes)
	// ブロック内の残りの領域は 0x00 

EBStudioでの実装

項目EBStudioの設定値
Version 1 (X4081はEPWING V1のサブセットのため)
書籍の種類 書籍作成時に指定
書籍名称 書籍作成時に指定
書籍ディレクトリ名 書籍作成時に指定
書籍ファイルディレクトリ位置 0
書籍管理情報記録位置 1
16X16外字ファイル名 GAI16F00
24X24外字ファイル名 GAI24F00
30X30外字ファイル名 GAI32F00
48X48外字ファイル名 GAI48F00
8X16外字ファイル名 GAI16H00
12X24外字ファイル名 GAI24H00
15X30外字ファイル名 GAI32H00
24X48外字ファイル名 GAI48H00

(2)電子ブック(CATALOG)

疑似コード

	WORD 登録書籍数;	// 媒体に記録される書籍数(最大50)
	BYTE 予備領域1[14];
	struct {
		struct {
			BYTE 連番;	// 出現順に
			BYTE dummy;
		} 予備領域2;
		BYTE 書籍名称[30];	// JIS X0208を使用、空白は00Hで埋める
		BYTE 書籍ディレクトリ名[8];	// JIS X0201を使用
	} 書籍ファイル管理情報[登録書籍数];	// (40 bytes)
	// ブロック内の残りの領域は 0x00 

書籍ファイル(HONMON/START)

JIS X4081

 書籍ファイル ::= 書籍管理情報&本文データ&著作権表示データ&(インデックス|メニュー表示データ)+&(書籍定義文字パターン|検索アシスト用データ|複合検索管理情報)*
 書籍ファイル ← 書籍名管理情報
 書籍管理情報 ← 書籍名管理情報
 書籍管理情報 ::= 書籍構成要素数,予備領域1,インデックス作成情報の取扱性,予備領域2,書籍構成要素+,表示方法の初期値情報
 書籍構成要素 ::= 書籍構成要素識別子,予備領域3,先頭アドレス,領域サイズ,インデックス作成情報有効性,インデックス作成情報,予備領域4
 表示方法の初期値情報 ::= 有効無効フラグ,予備領域5,一覧表表示,本文表示法,予備領域6
 インデックス作成情報 ::= 片仮名,英小文字,記号,長音文字,促音文字,よう(拗)音文字,外来語用小文字、濁音,半濁音,予備領域

疑似コード

struct {
	WORD 書籍構成要素数;	// この書籍ファイルに記録する書籍構成要素の個数
	BYTE 予備領域1[2];
	BYTE インデックス作成情報の取扱法;
		// 書籍構成要素全体で、インデックス作成情報が有効か否か
		// 00H:各書籍構成要素に記録されているインデックス作成情報による
		// 01H:インデックス作成情報は意味を持たない
		// 02H:書籍構成要素に記録されているインデックス作成情報が有効
	BYTE 予備領域2[11];
	struct {
		BYTE	書籍構成要素識別子;	// JIS X4081を参照
		BYTE	予備領域3;
		LONG	先頭アドレス;	// 構成要素の先頭ブロック数(1から始まる)
		LONG	領域サイズ;	// ブロック数
		BYTE	インデックス作成情報有効性;
			// 01H:インデックス作成情報は意味を持たない
			// 02H:インデックス作成情報が意味を持つ
		BYTE インデックス作成情報[3];	// JIS X4081を参照
		BYTE 予備領域4[2];
	} 書籍構成要素[書籍構成要素数];
	struct {
		BYTE 有効無効フラグ;	// 表示方法の初期値情報全体が有効か無効か
				// 00H:無効 01H:有効
		BYTE 予備領域5[3];
		BYTE 一覧表表示;	// 00H:直接本文表示 01H:一覧表から選択
		BYTE 本文表示法;	// 00H:一致項目のみ表示 
					// 01H:一致項目を先頭に本文を表示
		BYTE 予備領域6[10];
	} 表示方法の初期値情報;	// 検索結果の望ましい表示方法
	// ブロック内の残りの領域は 0x00 
} 書籍管理情報;

EBStudioでの実装

項目EBStudioの設定値
インデックス作成情報の取扱法00H
インデックス作成情報有効性 かな:02H インデックス作成情報が意味を持つ
表記:02H インデックス作成情報が意味を持つ
その他:01H インデックス作成情報が意味をもたない
インデックス作成情報 かな:00H 00H 00H(既定の清音化)
表記:41H 55H 40H(英小文字→英大文字、記号を削除 、その他はそのまま)
表示方法の初期値情報 全て00H

書籍構成要素

 JIS X4081では、書籍ファイルは複数の書籍構成要素から構成されます。 書籍構成要素には、本文データ、 著作権表示データ、 メニュー表示データ、 インデックス、 書籍定義文字パターン(外字)、 複合検索管理情報などがあります。 書籍ファイルに含まれる書籍構成要素は、先頭ブロックの書籍管理情報に書かれています。

EBStudioでの実装

 JIS X4081で定義されている書籍構成要素の種類は、EPWINGや電子ブックと若干相違があります。そのためEBStudioでは、EPWING検索ソフトウェアでの検索を保証するため、EPWING/電子ブックと互換性を持たせています。

EEBStudioは下記の書籍構成要素識別子を出力します。

識別子EBStudioJIS X4081
00H 本文 ←
01H メニュー 識別子は 20H
02H 著作権表示データ 識別子は 21H
03H 条件検索見出し 未定義
本文に記録すると思われる。
04H 前方一致かな見出し
05H 前方一致表記見出し
06H 後方一致かな見出し
0AH クロス条件検索(複合語検索)見出し
07H 後方一致表記見出し
70H 後方一致かなインデックス ←
71H 後方一致表記インデックス ←
80H 条件検索インデックス ←
81H クロス条件検索インデックス 複合語検索インデックス
90H 前方一致かなインデックス ←
91H 前方一致表記インデックス ←
D0H モノクロ図版 未定義
D2H カラー図版 未定義
D8H 音声 未定義
F1H EPWINGでは外部ファイルに記録
電子ブックではJIS X4081と同じ
外字(16×16)
F2H 外字(8×16)
F3H 外字(24×24)
F4H 外字(16×24)
F5H 外字(32×30)
F6H 外字(16×30)
F7H 外字(48×48)
F8H 外字(24×48)
FFH 複合検索管理情報 ←

本文データ

JIS X4081

 本文データ ::=(表示開始指定,項目データ+,表示終了指定)+,(メニュー表示用データ|入力候補テーブル)*
 項目データ ::= 検索キー記述子,表示用データ,別記事参照*,検索キー終了記述子,表示用データ
 メニュー表示用データ ::= メニュー項目+
 入力候補テーブル ::= 表示開始指定,メニュー項目+,表示終了指定
 メニュー項目 ::= メニュー記述子,表示用データ,メニュー終了記述子,アドレス情報
 表示用データ ::=(表示制御記述子*,文字の列,表示制御終了記述子*)*
 別記事参照 ::= 別項目参照記述子,矢印コード,表示用データ,別項目参照終了記述子,アドレス情報
アドレス情報 ::= ブロック番号,ブロック内オフセット

本文データ内の記述子(JIS X4081)

値 記述子名 意味及び取扱い
1F02H表示開始指定一連の項目データ群の最初を示す。
1F03H表示終了指定一連の項目データ群の最終を示す。
1F04H〜1F3FH表示制御用割当コード→別表
1F40H予約領域過去の実装との互換で使用してはならない。
1F41H検索キー記述子検索結果の項目の先頭を示す。
1F42H別項目参照記述子関連項目の記録位置を示す。
1F43Hメニュー記述子メニュー項目の先頭を示す。
1F44H〜1F60H予約領域各実装規約で扱う画像・音声などのデ一夕のリンク構造に用いる。
1F61H検索キー終了記述子検索結果の項目の見出し末尾を示す。
1F62H別項目参照終了記述子関連項目の参照記事の表題表示用の文字列の末尾を示す。
1F63Hメニュー終了記述子メニューの末尾を示す。
1F64H〜1F80H予約領域各実装規約で扱う画像・音声などのデ―夕のリンク構造に用いる。
1F81H〜1FDFH予約領域この規格では規定しない。

表示制御記述子(JIS X4081)

値 記述子名 意味及び取扱い
1F04H半角開始指定後続の文字列を半角表示する。
1F05H半角終了指定半角表示する文字列の終わりを示す。
1F06H下添え字開始指定後続する文字列を下添え字表示する。
1F07H下添え字終了指定下添え字表示する文字列の終わりを示す。
1F08H拡張領域拡張用コード。拡張方法は、附属書による。
1F09H字下げ指定後続する文字列を指定数,字下げ表示する。2進化10進数(2バイト)を後続させて,その値が字下げ数を示す。
1F0AH改行改行する。
1F0BH表の表示開始指定後続の表の表示終了指定までを一つの表として表示制御する。
1F0CH表の表示終了指定表の表示制御する文字列の終わりを示す。
1F0DH拡張領域拡張用コード。拡張方法は、附属書による。
1F0EH上添え字開始指定後続する文字列を上添え字表示する。
1F0FH上添え字終了指定上添え字表示する文字列の終わりを示す。
1F10H分割禁止開始指定後続する文字列の途中で行を折り返してはならないことを示す。
1F11H分割禁止終了指定途中行折り返しを禁止する文字列の終わりを示す。
1F12H強調開始指定後続する文字列を強調表示することを示す。強調表示の方法は再生システムに任せる。
1F13H強調終了指定強調表示する文字列の終わりを示す。
1F14H〜1F1FH拡張領域拡張用コード。拡張方法は,附属書による。
1FE0H拡張強調表示開始指定強調方法の指定付きで後続する文字列を強調表示することを示す。2進化10進数(2バイト)を後続させて,その値が強調表示方法を示す。
1FE1H拡張強調表示終了指定強調表示対象文字列の終わりを示す。
1FE2H〜1FFFH拡張領域拡張用コード。拡張方法は,附属書による。

EBDump.exeの本文表示例

[ID=00:本文] start=151F(5407), blocks=3

[151F:  0]<1F02>
[151F:  2]<1F09><0001><1F41><0160>あ<1F61>【亜】《国》<1F0A>
[151F: 1C]<1F09><0004>7画[音]ア(中)[訓]―<1F0A>
[151F: 3C]<1F04>(1)<1F05>あるものの次に位置する。<A421>亜熱帯<1F04>(あねつ
たい)<1F05>・亜流<1F04>(ありゆう)<1F05><1F04> (2)<1F05>亜細亜<1F04>(ア
ジア)<1F05>の略<1F04>(りやく)<1F05>。<A421>東亜<1F04>(とうあ)<1F05><1F0A>
[151F: D8]<1F09><0001><1F41><0160>ああ<1F61>《国》<1F0A>
[151F: EE]<1F09><0004>〈副〉あのよう(に)。「―強くては勝負<1F04>(しようぶ)
<1F05>にならない・あのひとはいつも―だ」[関連]こう・そう・―・どう<1F0A>
[151F:168]―言<1F04>(い)<1F05>えばこう言<1F04>(い)<1F05>う へりくつをなら
べて、言いのがれたりさからったりする。<1F0A>
[151F:1C4]<1F09><0001><1F41><0160>ああ<1F61>《国》<1F0A>
[151F:1DA]<1F09><0004>〈感〉<1F04>(1)(:<1F05>嗚呼)感動・おどろきなどの気
持ちをあらわすことば。「―、楽しかった」<1F04> (2)<1F05>応答や承知<1F04>
(しようち)<1F05>の意味をあらわすことば。「―、いいよ」[ぞんざいな言い方]
<1F0A>
[151F:298]<1F09><0001><1F41><0160>ああ‐いう<1F61>【ああいう】(ああ言う)《国》
<1F0A>

EBStudioでの実装

HTML 表示制御記述子(16進) 意味
<body> 1F02 表示開始
</body> 1F03 表示終了
<Hn > or <dt> 1F09 0001
1F41 0160
字下げ(0)
検索キー開始
</Hn > or </dt> 1F61 検索キー終了
<p> or <dd> 1F09 0002 字下げ(1)
</p>
</dd>
1F0A 段落の終了(改行)
<a href=""> 1F42
"→"
別項目参照
</a> 1F62
page (BCD4)
offset (BCD2)
別項目参照終了
文字列 JIS文字列 全角JIS文字列として書き込む。 文字コード範囲は2121H〜7426H。 これ以外の文字が出現した場合、「〓」を書き込む。 外字はA121H〜FE7EH。
全角→半角 1F04 半角開始
半角→全角 1F05 半角終了
<br> 1F0A 改行
<sub> 1F06 下添字開始
</sub> 1F07 下添字終了
<sup> 1F0E 上添字開始
</sup> 1F0F 上添字終了
<nobr> 1F10 分割禁止開始
</nobr> 1F11 分割禁止終了
<b> or <strong> 1FE0 0003 拡張強調表示開始(ボールド)
</b> or </strong> 1FE1 拡張強調表示終了
<i> or <em> 1FE0 0001 拡張強調表示開始(イタリック)
※検索ソフトウェアによっては、ボールドで表示される
</i> or </em> 1FE1 拡張強調表示終了
<object data="*.{avi|mpg|mpeg}">(動画) 1F39
1000 9999
0000 0000
0000 0000
0000 0000
0000 0000
ファイル名
動画(mpg/avi)
ファイル名はJISコードで12文字固定(大文字)。
ファイルは外部ファイルに格納。
</object> 1F59 動画終了
<object data="*.wav">(音声) 1F4A
0001 0112
page1 (BCD4)
offset1 (BCD2)
page2 (BCD4)
offset2 (BCD2)
PCM音声
page1/offs1は開始アドレス、 page2/offs2は終了アドレス。
データは書籍構成要素識別子=D8に格納
</object> 1F6A 音声終了
<img src="*.bmp" alt="名称"> 1F44
0001
width (WORD)
height (WORD)
名称 (可変長)
1F64
page (BCD4)
offset (BCD2)
1F0A
モノクロ図版(BMP)
データは書籍構成要素識別子=D0に格納
<img src="*.bmp" alt="名称"> 1F4D
0009 0000
0000 0000
0000 0000
page (BCD4)
offset (BCD2)
名称 (可変長)
1F6D
1F0A
カラー図版(BMP)
データは書籍構成要素識別子=D2に格納
<img src="*.{jpg|jpeg}" alt="名称"> 1F4D
1209 0000
0000 0000
0000 0000
page (BCD4)
offset (BCD2)
名称 (可変長)
1F6D
1F0A
カラー図版(JPEG)
データは書籍構成要素識別子=D2に格納

マルチメディアデータの詳細は、 「EPWINGのマルチメディアデータについて」をご覧ください。

著作権表示データ

JIS X4081

 著作権表示データ ::= 表示用データ
 表示用データ ::=(表示制御記述子*,文字の列,表示制御終了記述子*)*

メニュー表示データ

EBDump.exeのメニュー表示例

[ID=01:メニュー] start=000E(14), blocks=3

[E:  0]<1F02>
[E:  2]<1F43>現代国語辞典の使い方<1F63>[E:4C]<1F0A>
[E: 22]<1F43>コンサイス外来語辞典の使い方<1F63>[13:7E8]<1F0A>
[E: 4A]<1F03>
[E: 4C]<1F02>
[E: 4E]<1F43>〔1〕見出しの範囲<1F63>[E:1D8]<1F0A>
[E: 6C]<1F43>〔2〕見出しの示し方<1F63>[E:294]<1F0A>
[E: 8C]<1F43>〔3〕見出しの並べ方<1F63>[E:6E6]<1F0A>
[E: AC]<1F43>〔4〕常用漢字の示し方<1F63>[F:4A6]<1F0A>
[E: CE]<1F43>〔5〕語の書きあらわし方<1F63>[10:26A]<1F0A>
[E: F2]<1F43>〔6〕品詞・活用等の示し方<1F63>[11:A8]<1F0A>
[E:118]<1F43>〔7〕外来語の原語の示し方<1F63>[11:73E]<1F0A>
[E:13E]<1F43>〔8〕ことばの意味・用法などの解説<1F63>[12:1D4]<1F0A>
[E:16C]<1F43>〔9〕[類][比較][対][関連]の表示<1F63>[13:38A]<1F0A>
[E:1A0]<1F43>〔<1F04>10<1F05>〕[注意][派生][可能]の表示<1F63>[13:584]<1F0A>
[E:1D6]<1F03>

EBStudioでの実装

HTML 表示制御記述子(16進) 意味
このメニュー階層の先頭 1F02 表示開始
<Hn> 1F43 メニュー
</Hn> 1F63
page (BCD4)
offset (BCD2)
1F0A
メニュー終了
階層メニューで子メニューがある場合は、 page/offsetは子メニューの先頭アドレス。 最下位の場合、本文のアドレスを指す。
このメニュー階層の最後 1F03 表示終了

インデックス

JIS X4081

 インデックス ::=(上位インデックス)+,最下位インデックス

(1) 上位インデックス

JIS X4081

 上位インデックス ::= インデックス群識別,キー長,上位エントリ数(,上位エントリ)+
 上位エントリ ::= 上位エントリキー情報,下位インデックス所在ブロック番号

インデックス群識別(b7を最上位ビットとし,b0を最下位ビットとする)
    b7:上位インデックスか最下位インデックスかの区別
      0:上位インデックスであることを示す。
      1:最下位インデックスであることを示す。
    b6 : 同じ階層のインデックス中で先頭か否かを示す。
      0:先頭ではないことを示す。
      1:先頭であることを示す。
    b5 : 同じ階層のインデックス中で最終か否かを示す。
      0:最終でないことを示す。
      1:最終を示す。
    b4 : 集団概念付きか否かを示す。
      0:一般型エントリから構成されることを示す。
      1:集団概念付きエントリから構成されることを示す。
    b3〜b0 : 将来の拡張のための領域。この規格では使用しない。

インデックス群識別について

 各インデックスページの1バイト目は、インデックス群識別であり、インデックスの属性を示すビットマスクです。

上位インデックスのインデックス群識別
1ブロックで収まる0x60:単独インデックスブロック
2ブロック以上 0x40 : 同じ階層の先頭インデックスブロック
0x00 : 同じ階層の途中のインデックスブロック
0x20 : 同じ階層の最終インデックスブロック

最下位インデックス(一般型エントリ)のインデックス群識別
1ブロックで収まる0xE0:単独インデックスブロック
2ブロック以上 0xC0 : 先頭インデックスブロック
0x80 : 途中のインデックスブロック
0xA0 : 最終インデックスブロック

最下位インデックス(集団概念付エントリ)のインデックス群識別
1ブロックで収まる0xF0:単独インデックスブロック
2ブロック以上 0xD0 : 先頭インデックスブロック
0x90 : 途中のインデックスブロック
0xB0 : 最終インデックスブロック

EBDump.exeの上位インデックス表示例

[ID=90:前方一致かなINDEX] start=0017(23), blocks=3

block#=0018(24) 
ID=60	桁数=30	要素数=11 
かあと[30]	<blk=19(25)>
きようしゆくひようけん[30]	<blk=1A(26)>
こうえんいらい[30]	<blk=1B(27)>
しやくようのもうしこみのしやせ[30]	<blk=1C(28)>
しようかいしよう[30]	<blk=1D(29)>
そうきんのれいしよう[30]	<blk=1E(30)>
ちんしやこうこく[30]	<blk=1F(31)>
にゆうかくいわい[30]	<blk=20(32)>
ふくしやようてんひよう[30]	<blk=21(33)>
みまいしよう[30]	<blk=22(34)>
[30]	<blk=23(35)>

疑似コード

	BYTE インデックス群識別;
		// 0x60	単独インデックスブロック
		// 0x40	同じ階層の先頭インデックスブロック
		// 0x00	同じ階層の途中のインデックスブロック
		// 0x20	同じ階層の最終インデックスブロック
	BYTE キー長;	// 00H以外:固定長を示す
	WORD 上位エントリ数;
	struct {
		BYTE 上位エントリキー情報[キー長];
		LONG 下位インデックス所在ブロック数;
	} 上位エントリ[上位エントリ数];

EBStudioでの実装

(2) 最下位インデックス

JIS X4081

 最下位インデックス ::= インデックス群識別,キー長,エントリ数(,集団概念付きエントリ|一般型エントリ)+
 集団概念付きエントリ ::=(基本エントリ|集団エントリ)+
 基本エントリ ::= エントリ識別,キー長,基本エントリキー情報,項目アドレス
 集団エントリ ::= エントリ種別,キー長,メンバ数,集団エントリキー情報(,メンバ情報)+
 メンバ情報 ::= メンバ識別,キー長,キー情報,項目アドレス
 一般型エントリ::=キー長,キー情報,項目アドレス
 項目アドレス ::=項目所在ブロック番号,項目所在ブロック内オフセット,候補リスト所在ブロック番号,候補リスト所在ブロック内オフセット

 最下位インデックスの形式には一般型エントリと集団概念付エントリがあります。 集団概念付エントリは、仮名検索の同音異義語や、条件検索で同じ単語が本文の複数箇所に出現する場合など、同じ検索語に複数のエントリが対応する場合に使用します。一般型エントリは、検索語に対応するエントリが一つしかない場合に使用します。

EBDump.exeの最下位インデックス表示例

block#=0019(25) 
ID=D0	桁数=0	要素数=85 
00:あいこのあいさつ[16]	[67:02][4E:02]
80:あいさつしよう[14]<1個>
C0:あいさつじょう[14]	[67:2EC][4E:12]
80:あいしようのてかみ[18]<1個>
C0:あいじょうのてがみ[18]	[67:5D8][4E:1E]
80:あくふんのちんしや[18]<1個>
C0:あくぶんのちんしゃ[18]	[68:71E][4E:2A]
80:あつせんいらい[14]<1個>
C0:あっせんいらい[14]	[69:12E][4E:36]
80:あつせんしようたく[18]<1個>
C0:あっせんしょうだく[18]	[6A:4E][4E:44]
80:あつせんのしやせつ[18]<1個>
C0:あっせんのしゃぜつ[18]	[6A:52C][4E:52]
80:あつせんほうこく[16]<1個>
C0:あっせんほうこく[16]	[6B:2D4][4E:62]
00:あてさき[8]	[6C:2AE][4E:70]
00:あてさきのへんこう[18]	[6C:3DC][4E:78]
00:あてな[6]	[6C:4E2][4E:86]
00:あてなこうこく[14]	[6D:2C4][4E:8E]
80:あとつけ[8]<1個>
C0:あとづけ[8]	[6D:470][4E:9A]
80:あとつけのはいち[16]<1個>
C0:あとづけのはいち[16]	[6D:6C8][4E:A2]
80:あんけえと[10]<2個>
C0:あんけーと[10]	[6E:328][4E:B0]
C0:アンケート[10]	[6E:328][4E:BC]

a. 前方一致表記検索、後方一致表記検索の場合

疑似コード

	BYTE インデックス群識別;
			// 0xE0	一般型エントリ・単独インデックスブロック
			// 0xC0	一般型エントリ・先頭インデックスブロック
			// 0x80	一般型エントリ・途中のインデックスブロック
			// 0xA0	一般型エントリ・最終インデックスブロック
	BYTE キー長;	// 00H:可変長を示す
	WORD エントリ数;
	struct {
		BYTE キー長;		// キー情報の長さ(バイト数)
		BYTE キー情報[キー長];	// 後方一致の場合逆順
		BCD4  項目所在ブロック番号
		BCD2  項目所在ブロック内オフセット
		BCD4  候補リスト所在ブロック番号
		BCD2  候補リスト所在ブロック内オフセット
	} 一般型エントリ[エントリ数];

EBStudioでの実装

 キー情報の書き込みでは次の処理を行っています。

空白 削除する(オプションで変更可)
’・− 削除する(オプションで変更可)
英小文字 英大文字に変換

b. 前方一致かな検索、後方一致かな検索

用語 意味
基本エントリ 同じ検索文字列に対して、複数の検索結果が存在しない場合
基本エントリキー情報 目的データの単語を示す文字列
集団エントリ 同じ検索文字列に対して、複数の検索結果が存在する場合。キーの清音変換によって発生する同音異義語も含む。
集団エントリキー情報 集団エントリを代表する目的データの単語を示す文字列
しっこう(執行)、しっこう(失効)、じっこう(実行)に対して、
”しつこう”をキー情報として記録する

疑似コード

	BYTE インデックス群識別;	
		// 0xF0	集団概念付エントリ・単独インデックスブロック
		// 0xD0	集団概念付エントリ・先頭インデックスブロック
		// 0x90	集団概念付エントリ・途中のインデックスブロック
		// 0xB0	集団概念付エントリ・最終インデックスブロック
	BYTE キー長;	// 00H:可変長
	WORD エントリ数;
	struct {
		// 基本エントリ、または集団エントリのいずれかで記録される
		// エントリ識別に従い、基本エントリと集団エントリを判別する

		struct {
			BYTE エントリ識別; // 0x00 : 基本エントリ
			BYTE キー長;	// 基本エントリキー情報の長さ(バイト数)
			BYTE 基本エントリキー情報[キー長]; // 後方一致の場合逆順
			BCD4  項目所在ブロック番号
			BCD2  項目所在ブロック内オフセット
			BCD4  候補リスト所在ブロック番号
			BCD2  候補リスト所在ブロック内オフセット
		} 基本エントリ;

	or

		struct {
			BYTE エントリ識別; // 0x80 : 集団エントリ
			BYTE キー長;	// 集団エントリキー情報の長さ(バイト数)
			WORD メンバ数;
			BYTE 集団エントリキー情報[キー長]; // 後方一致の場合逆順
							// 清音化されている
			struct {
				BYTE メンバ識別; // 0xC0
				BYTE キー長;	// キー情報の長さ(バイト数)
				BYTE キー情報[キー長]; // 後方一致の場合逆順
				BCD4  項目所在ブロック番号
				BCD2  項目所在ブロック内オフセット
				BCD4  候補リスト所在ブロック番号
				BCD2  候補リスト所在ブロック内オフセット
			} メンバ情報[メンバ数];
		} 集団エントリ;

	} 集団概念付きエントリ[エントリ数];

EBStudioでの実装

 キー情報の清音化では次の処理を行っています。

空白 削除する(オプションで変更可)
’・− 削除する(オプションで変更可)
片仮名 ひらがなに変換
長音"ー" 直前の文字の母音に変換
促音"っ" "つ"に変換
拗音"ゃゅょゎ" "やゆよわ"に変換
小文字"ぁぃぅぇぉ" "あいうえお"に変換
濁音 清音に変換
半濁音 清音に変換

清音化前と後で異なる文字列になった場合、候補文字が一つしかない場合でも、基本エントリではなく集団エントリで記録しています。

c. 条件検索、クロス条件検索

疑似コード

	struct {
		BYTE エントリ識別; // 0x80 : 集団エントリ
		BYTE キー長;	// 集団エントリキー情報の長さ(バイト数)
		WORD メンバ数;
		BYTE 集団エントリキー情報[キー長];
		BCD4  候補リスト所在ブロック番号	// ※先頭メンバのアドレス
		BCD2  候補リスト所在ブロック内オフセット
		struct {
			BYTE メンバ識別; // 0xC0
			BCD4  項目所在ブロック番号
			BCD2  項目所在ブロック内オフセット
		} メンバ情報[メンバ数];
	} 集団エントリ;

※条件検索の候補リスト所在ブロック番号・オフセットは、メンバ情報の先頭(メンバ情報[0])に対応します。 メンバ情報[i]に対応する見出しは、候補リスト所在ブロック番号・オフセットが指す見出しから数えて i 番目の見出しになります。

EBStudioでの実装

d. 項目別条件検索

疑似コード

	struct {
		BYTE エントリ識別; // 0x80 : 集団エントリ
		BYTE キー長;	// 集団エントリキー情報の長さ(バイト数)
		WORD メンバ数;
		BYTE 集団エントリキー情報[キー長];
		struct {
			BYTE メンバ識別; // 0xC0
			BCD4  項目所在ブロック番号
			BCD2  項目所在ブロック内オフセット
			BCD4  候補リスト所在ブロック番号
			BCD2  候補リスト所在ブロック内オフセット
		} メンバ情報[メンバ数];
	} 集団エントリ;

複合検索管理情報

JIS X4081

 複合検索管理情報 ::= 複合エントリ数,予備領域1(,複合エントリ)+
 複合エントリ ::= 書籍構成要素数,予備領域2,検索名称(,書籍構成要素)+
 書籍構成要素 ::= 書籍構成要素識別子,予備領域3,先頭アドレス,領域容量,予備領域4

疑似コード

	WORD 複合エントリ数;
	BYTE 予備領域1[14];
	struct {
		BYTE 書籍構成要素数;
		BYTE 予備領域2;
		BYTE 検索名称[30];	// 30バイトに満たない場合、残り00H詰め
		struct {
			BYTE 書籍構成要素識別子;
				// 01H 入力候補テーブル
				// 05H 前方一致表記形見出し(X4081では未定義)
				// 07H 後方一致表記形見出し(X4081では未定義)
				// 0DH 項目別条件検索見出し(X4081では未定義)
				// 71H 後方一致表記形検索インデックス
				// 91H 前方一致表記形検索インデックス
				// A1H 項目別条件検索インデックス
			BYTE 予備領域3;
			LONG 先頭アドレス;	// 要素の存在するブロック番号
			LONG 領域容量;		// 要素のブロック数
			BYTE 予備領域4[6];	// X4081では[5]?
		} 書籍構成要素[書籍構成要素数];
	} 複合エントリ[複合エントリ数];

EBStudioでの実装

書籍定義文字パターン(外字)

JIS X4081

 書籍定義文字パターン ← 書籍名管理ブロック
 書籍定義文字パターン ::= 制御情報,パターンブロック+
 制御情報 ::= 予備領域1,予備領域2,横ドット構成,縦ドット構成,先頭コード,登録パターン数,予備領域3
 パターンブロック ::= 文字パターン+,空き領域

疑似コード

	struct {
		struct {
			BYTE 予備領域1;
			BYTE 予備領域2[7];
			BYTE 横ドット構成;	// 8,12,16,24,32,48
			BYTE 縦ドット構成;	// 16,24,30,48
			WORD 先頭コード;	// 先頭の外字コード
			WORD 登録パターン数;	// 記録する外字の総数
			BYTE 予備領域3[2034];
		} 制御情報;
		struct {
			BYTE 文字パターン[横ドット構成*縦ドット構成/8]
			BYTE 空き領域[1024byteブロックの残りバイト数]; 
		} パターンブロック[登録パターン数];
	} 書籍定義文字パターン;

EBStudioでの実装

「広辞苑」等のEPWINGタイトルの実装に合わせて、横ドット数は8の倍数としています。

JIS X4081EBStudio
16×16 ←
8×16 ←
24×24 ←
12×24 16×24
30×30 32×30
15×30 16×30
48×48 ←
24×48 ←

実験した限りでは、24ドット以上の外字に対応している検索ソフトウェアは ほとんどありません。OASYS-CDViewのみ、印刷時に24ドット以上の外字を使用します。 一般に16ドットだけあれば充分でしょう。

付録

検索ソフトウェアの特記事項

EBStudioの開発中に遭遇した、検索ソフトウェア固有の症状について記録しておきます。

DDwin

Jamming

OASYS CD-View

電子ブックプレーヤでの検索

EBStudioの出力形式を電子ブックとして作成し、8cmCD-Rに焼いて電子ブックプレーヤ用の専用ジャケットに格納すれば、SONY電子ブックプレーヤDATA DISCMANで検索できることが確認されています ( http://homepage2.nifty.com/thakata/Edic/etc_EB_EP.htm )。その結果分かったことは:

海外版電子ブックについて

EBStudioの出力する電子ブックはEBXA準拠です。電子ブックには海外版のEBGという規格があります。EBGのEBXAとの違いについて、確認した情報は以下の通りです。

履歴

初版 2001/2/5
五版 2001/2/19
六版 2001/4/21
JIS X4081の拡張BNFを掲載。「付録」に「検索ソフトウェアの特記事項」「電子ブックプレーヤについて」「海外版電子ブックについて」を加筆。その他全般に加筆。