英辞郎辞書変換用スクリプトの作成
Ubuntu 8.10 に切り替えてから1ヶ月ほど。これまで gnome-dictionary を使ってたんだけど、dictd と組み合せないとオフラインでは使えなかったりちょっと使い勝手に難があった。ってなわけで、http://stardict.sourceforge.net:StarDict に乗り換えてみた。
StarDict は GPL2 で普通に universe にあるのでインストールに難しいことは何もない。"stardict" が StarDict のプログラム本体が含まれるパッケージで、"stardict-tools" には辞書の変換用スクリプトが含まれているようだ。
% sudo aptitude install stardict stardict-tools
StarDict で使える形式の辞書を作成するためには、以下のステップを踏む。
- 検索キーと内容をタブで区切った UTF-8 なファイルを用意する
- stardict-tools に含まれる /usr/lib/stardict-tools/tabfile *1 に前段で作成したファイルを食べさせて変換させる
- できあがった辞書ファイル (*.dict.dz, *.idx, *.ifo) を /usr/share/stardict/dic に配置する
手元に 2005 年頃に買った英辞郎の辞書データがあったので、こいつを StarDict に取り込めるように変換スクリプトでも書いてみようと思ったが…、実際には英辞郎の辞書形式もタブ区切りなファイルだったので文字コード以外は特に変換すべき項目はない。おまけに、手元に保存していた英辞郎の辞書ファイルは以前に UTF-8 に変換していたこともあって、特に何も変換すべきことはなかった。
そんなことに気づいたのはスクリプトの体裁を整えた後だったのだけど、短いとは言えせっかく作ったものをローカルディスクに死蔵させておくのももったいないので晒しておくことにする。自分の例の場合には使わなかったものの、Iconv を使って文字コードの変換もできるようにはしてある。
#!/usr/bin/env ruby # Eijiro Dictionary format to Stardict converter require "iconv" class EijiroEntry DEFAULT_OPTIONS = { # :input_charset => "Shift_JIS", :input_charset => "UTF-8", :output_charset => "UTF-8" } def initialize(key, value, options={}) @key = key @value = value @string = nil @input_charset = nil @output_charset = nil parse_options(options) end attr_reader :key attr_reader :value def to_s() @string ||= convert_charset(@key + "\t" + @value) end private def parse_options(options) options = DEFAULT_OPTIONS.merge(options) @input_charset = options[:input_charset] @output_charset = options[:output_charset] end def convert_charset(str) if @input_charset != @output_charset if @input_charset.nil? raise("i do not know how to guess the charcode of input string with iconv") else str = Iconv.conv(@input_charset, @output_charset, str) end end str end end ARGF.each { |line| key, value = line.split(/\t/, 2) STDOUT.puts(EijiroEntry.new(key, value)) }
上記の Ruby スクリプトを e2sd.rb とか言う名前で保存して、以下のように変換する。英辞郎辞書のファイル名はそれぞれ eijiro81.txt, reiji81.txt, ryaku81.txt, waeiji81.txt としています。
% chmod 755 e2sd.rb % for f in eijiro81.txt reiji81.txt ryaku81.txt waeiji81.txt; do ./e2sd.rb $f > `basename $f .txt`.utf8 /usr/lib/stardict-tools/tabfile `basename $f .txt`.utf8 sudo mv `basename $f .txt`{.dict.dz,.idx,.ifo} /usr/share/stardict/dict/ done
*1:インストール方法によってはパスは異なるかも知れない。