Menu

電子ブック形式をEPWING形式に変換する(「大辞林」の外字対策)

【動機】
電子ブックはEPWINGとほとんど同じ形式をしており、大きな違いは「外字データ」 を辞書データの中にもっているか、外にもっているかだけです。私がこの変換に取り組んだ理由は、電子ブック版「大辞林&デイリー英和・和英」を減量化して Buckingham EB Player で使用すると、外字が正常に表示されないという障害に遭い、その解決策になるかもしれないと考えたからです。結論を先にいうと、EPWING化(外字デー タの外部化)によって問題はみ ごと解決しました。ただし、第1水準・第2水準以外の漢字については、この辞書では、もともと外字でなくグラフィックで表示する仕様になっているため、 Buckingham EB Player で表示することはできません。

【手順】
1)外字データ の抽出
電子ブックの辞書データSTARTから外字データを抽出するためのPerlスクリプト を末尾に載せます。
(1) Perlをインストールしていない人は、まずウェブから探してきてインストールする。
小生は、以下のサイトから ActivePerl 5.6.1.638 をインストールしました。
http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl
(2) 末尾の「# gaijiext.pl」以降最後までを新規のテキストファイルにコピー &ペーストし、gaijiext.pl という名前で保存する。
(3) perl.exe のあるディレクトリに、STARTと gaijiext.pl をコピーする。
(4) gaijiext.pl をダブルクリックすると、一瞬で処理が終わり、GA16FULL と GA16HALF のファイルが生成される。もしダブルクリックで Perl が自動起動しなかったときは、MS-DOSで Perlのディレクトリから下記のコマンドを実行する。
perl gaijiext.pl

2)カタログの修正
次のコマンドで、電子ブックの catalog をテキスト形式に出力する。
catdump catalog > catalog.txt
たとえばこのような内容になっている。
----------------------------------------------------------------
; 電子ブック/EPWING カタログ内容 (generated by catdump v1.2pre)

[Catalog]
FileName   = catalog
Type       = EB
Books      = 1

[Book]
BookType   = 0100
Title      = "大辞林&ディリー英和・和英"
Directory  = "DGX01"
----------------------------------------------------------------
以下の修正をする。
 catalog  → catalogs
 EB        → EPWING1
 0100   → 0101  (前の2桁は辞書の種類、後の2桁はEPWING規約のバージョンを表す)
末尾に次の2行を追加する。
 ZenGaiji   = "GA16FULL"
 HanGaiji   = "GA16HALF"
このファイルを上書き保存したのち、以下のコマンドで EPWING の catalogs を作成する。
catdump -u catalog.txt catalogs
(catdump については関連ページを参照のこと)

3)減量化
squeeze を用いて、START の外字データ等の不要データを取り除き、HONMON のファイルを生成させる。コマンドはたとえば次のようになる。
squeeze -d01-03,06-8F,92-FF start honmon 
(squeeze については関連ページを参照のこと)

4)フォルダへの格納
上記ファイルを以下の配置で、フォルダに格納する。このとき、親フォルダ名は任意だ が、辞書フォルダ名は、catalogs に記載されているフォルダ名を使わなければいけない(上の例では DGX01)。
〔親フォルダ〕┬ catalogs
       └〔辞書フォルダ〕┬〔data〕 ─ HONMON
                └〔gaiji〕─ GA16FULL, GA16HALF

圧縮は必要に応じ、親フォルダごと、あるいは HONMON だけ行い(→関連ページ)、 そののち Palm の外部メモリにコピーする。
なお、gaijiext.pl の動作確認は、電子ブックの EB および EBXAでしかしていません。おそらく、s-EBXA ではだめでしょう。


# gaijiext.pl
open(START, "START");
open(GA16FULL, ">GA16FULL");
open(GA16HALF, ">GA16HALF");
binmode START;
binmode GA16FULL;
binmode GA16HALF;
seek(START, 0, 0);
read(START, $buf, 16);
($a, $n)=unpack("a C", $buf);
for ($i=1; $i<=$n; $i++) {
    read(START, $buf, 16);
    $f{substr($buf, 0, 1)}=$buf;
}
($a, $adr, $b, $c)=unpack("a4 n n n", $f{"\xF1"});
for ($i=1; $i<=$c; $i++) {
    seek(START, 0x0800*($adr-1), 0);
    read(START, $buf, 2048);
    print GA16FULL $buf;
    $adr++;
}
($blkid, $a, $adr, $b, $c)=unpack("a a3 n n n", $f{"\xF2"});
for ($i=1; $i<=$c; $i++) {
    seek(START, 0x0800*($adr-1), 0);
    read(START, $buf, 2048);
    print GA16HALF $buf;
    $adr++;
}
close(START);
close(GA16FULL);
close(GA16HALF);