テーブルの変換

日本語の変換テーブルに基づいて、変換処理を実現するときに、変換テーブルを記述したテキストファイルから、C/C++ 用のヘッダファイルを作り出すあたり。

実現すべきは、

  1. どのような変換を行うかの確認
  2. 変換スクリプトの処理内容の確認、作成
  3. 変換後のファイルの確認

くらいですね。では、順番にみていきましょう。

・どのような変換を行うかの確認

ま、要は文字列のパターンを異なる文字列パターンにするだけなので、その変換前、後がペアが管理されてればよい。変換前後の文字は、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

/*
  ローマ字・かな変換用のテーブル
  Satofumi KAMIMURA
  $Id$
*/

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 /* !ROMAN_CONVERT_TBL_H */

ちなみに、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} $< > $@ 

これを利用する変換処理プログラムは、また今度〜♪

変換処理のテストと実装 へ」

Generated on Mon Apr 13 22:52:06 2009 by  doxygen 1.5.7.1