Allegro で 日本語入力 を行うためのメモ。

 
2005年4月27日現在 Allegro 4.2.0 β2 がリリースされていますが、この文書ではAllegro の バージョンは 4.1.18 で説明する。
なお、バージョンが変わって仕様が変わることもあるので、ここに書かれたメモの正確性は保証しないし責任を持ちません。

日本語入力のメモ

Allegroは今のところIMEからの日本語入力には未対応。
IMEを使った漢字変換までとはいかないけど、せめてキーボードからのローマ字→ひらがな 入力ができるようにしたい。


Allegro と Cocoa がどういう仕組みでつながっているのかまだよくわかっていないので、 Cocoa 側からのアプローチは断念。 結局キー入力 からローマ字→ 簡易ひらなが変換するプログラムを書く方法に落ち着いた。

これならUnicode フォントさえあれば、OSに関係なく使う事ができる。車輪の再発明になってしまうけど、気にしない。
Allegro の 説明書によれば、Allegroは UTF+8, UTF-16 に対応している。

文字コードはUTF-8 を採用することにした。これならOSによってエンディアンが変化しないのでプログラムは複雑にならなくて済む。和文フォント描画は Glyph Keeper と みかちゃんフォント を使うことにした。

仕様:
スキャンコードを利用して、キー入力を取得。
readkey(); のUnicode対応版である ureadkey(); を使う。
keypress() した時だけ。scancode を更新する。
capslock キーで ひらがな/カタカナ入力切り替えができる。
変換バッファは、3文字 を超えたり、文字変換が行われる度にリセットする 。 (ローマ字で構成する 文字数の最大は SHI とか TSU の 3文字だから)

ほんじつはせいてんなり = 日本語バッファ
honjitsuhaseitennnari = 入力バッファ
ri = 変換バッファ



メモ

「sa」 と入力があったとき、「さ」と表示する場合、UTF-8 では全角ひらがなの「さ」 は 「0xE38195」で表記される、実際には、 0xE3 0x81 0x95 という連続したデータとなる。
また、キー入力では 「s」は「0x73」、「a 」は「0x61」で表記される。

ustrcat 関数によって 日本語バッファ の最後尾に データを連結することで文字列を増やしていく。
ustrcat( textbuffer , "\xE3\x81\x95"); (\ = バックスラッシュ)または、
ustrcat( textbuffer , "さ");

変換バッファtranstext の文字列と変換テーブルを照合して、ひらがなに変換する。
if( 0 == ustricmp(transtext , "sa" ) ){ ustrcat( tests , "さ"); test_caret+=3; reeflag=1; }
if( transtext[0]=='s' && transtext[1]=='a'){ ustrcat( tests , "さ"); test_caret+=3; reeflag=1; }

キーストロークと変換がうまく対応するか試すために、 しめさば、shi me sa ba と入力できるようにした。

ローマ字→ひらがな 変換テーブル は POBox の変換テーブルを参考にした。 変換テーブルの構造体データを構成する際に、はじめは配列を使っていたのだが、なぜかほかのデータまで表示してしまう現象が発生した。
bya → ビャbye
この問題はポインタを使うことで回避できた。
漢字変換は、まだ実装していない。


struct trans_table[]{
char key[3];
char *dist;
char *disth;
} itbl

struct trans_table rtok_table[]={
{ "a" , "ア" ,"あ" } ,
{ "gya" , "ギャ" ,"ぎゃ" } ,


キー入力のエミュレーションができるらしいので、ソフトウェアキーボードのようにマウスでボタンをクリックして文字を表示することもできるかもしれない。
GUI のテキスト入力の際に割り込みをかけて、テキストフォームに日本語が入力できればAllegroを充分に生かるのに…。

参考文献:
  • Pobox
  • domifaraoop の UTF-8 ひらがな字コード表。
  • Fonts and text input



  • <arolf_infoseek_jp> Tsukubado