日本語の変換テーブルに基づいて、変換処理を実現するときに、変換テーブルを記述したテキストファイルから、C/C++ 用のヘッダファイルを作り出すあたり。
実現すべきは、
- どのような変換を行うかの確認
- 変換スクリプトの処理内容の確認、作成
- 変換後のファイルの確認
くらいですね。では、順番にみていきましょう。
・どのような変換を行うかの確認
ま、要は文字列のパターンを異なる文字列パターンにするだけなので、その変換前、後がペアが管理されてればよい。変換前後の文字は、Unicode なので、Uint16 の配列に格納する。変換テーブルを見る限り、3文字以上のパターンはないので、配列サイズは末尾の \0 を含めて4となる。
{ 'a', '\0' }, { 0x3042, '\0' }
{ 'k','y','a', 0x00 }, { 0x304d, 0x3083, 0x00 },
また、「は」に濁点で「ば」という変換は、以下のようになる。
{ 0x306f, '@', 0x00 }, { 0x3070, 0x00 },
まぁ、こんな感じかな?
作るスクリプトの出力形式は上に示した通り。あとは変換元、変換先のサイズをスクリプト処理中に計算してやればよさげ。
作ったスクリプトは以下の通り。
言語は Ruby で、
uconv モジュールをインストールして使っている。
で、変換結果の抜粋は、こんな感じ。
#ifndef ROMAN_CONVERT_TBL_H
#define ROMAN_CONVERT_TBL_H
enum { ROMAN_CONVERT_SIZE_MAX = 5 };
const static Uint16 RomanTable[][2][5] = {
{ { 'a', 0x00 }, { 0x3042, 0x00 }, },
{ { 'i', 0x00 }, { 0x3044, 0x00 }, },
(中略)
{ { 'l','k','e', 0x00 }, { 0x30f6, 0x00 }, },
{ { 'x','k','e', 0x00 }, { 0x30f6, 0x00 }, },
{ 0x00 }, { 0x00 }
};
#endif
ちなみに、Makefile にはこんな感じの依存関係を追加しておけばよい。
RUBY = ruby
INPUT_CONVERT_SCRIPT = cnvTable2header.rb
romanConvert.h : roman_table.txt ${INPUT_CONVERT_SCRIPT}
ruby ${INPUT_CONVERT_SCRIPT} $< > $@
kanaConvert.h : kana_table.txt ${INPUT_CONVERT_SCRIPT}
ruby ${INPUT_CONVERT_SCRIPT} $< > $@
これを利用する変換処理プログラムは、また今度〜♪