2007年9月8日土曜日

C言語での日本語入力。

今回のインターンシップでのソフトウェア開発はC言語を用いて行いました。
C言語はそもそも2バイト文字が使えないのですが、そこをユーザーのスキルでカバーできてしまうのがC言語の良さ(悪さ?)でしょう。
(俺のようなスキル不足の人間には辛いが・・
(あと適当に書いてるだけなんで、ミスだらけだ。
MS-DOSプロンプト上での実行なので、(幸いにも)S-JISしか考慮してないです。
普段はLinux環境でプログラミングしているので、S-JISのダメ文字によるコンパイルエラーにはビビリました。

引用:wikipedia-Shift JIS
2バイト目に0x5Cを持つ文字のことを、俗にダメ文字と呼び、この中には「ソ」「構」「能」「表」など一般に使用頻度の高い文字も多い
http://ja.wikipedia.org/wiki/Shift_JIS

(ダメ文字の場合はその漢字の直後に\を書いてあげればOK。gccでのコンパイルも同様


C言語が扱う文字は基本的に1バイトです。
コンパイラも処理としては文字コードを認識せずに、ではそれを2バイト文字だと解釈せずに、1バイトの文字列としてメモリ空間に格納するように処理しているようですね。
S-JISならば文字列の取得は標準入力から1文字ずつ読み取り、リターンコードを検出し、その部分をヌル文字に変換してやれば問題ないです。
スペースやタブをどう扱うかはその文字列の使い方次第でしょう。
1バイト文字と2バイト文字の区別は基本的に1バイト目の文字コードの大きさをifで判断します。
基本的にASCII文字ならば1バイト目の最上位ビットが0であり、2バイト文字ならば1となります。
それを利用してい1バイト目の文字コードが0x7Fより小さく、0x21より大きいならば1バイト文字だと判断させるのが簡単です。
入力された文字列にどのようなエスケープシーケンスなどが含まれるかなどは事前に調べる必要があります。
C言語の場合は1バイト毎に処理できるので、かなり細かく操作できます。
今回はS-JISを扱う前提なのでよかったのですが、文字コードの予測ができない場合の処理は複雑すぎますね。

0 件のコメント: