このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

CでCGIを書く際の漢字の処理方法は?

発言者:hkawa
( Date Monday, December 16, 1996 21:03:13 )


C言語でFORMからの入力を扱うプログラムを書いているのですが日本語がうまく表示できません。
具体的には、入力データをそのまま表示するものなんですが、日本語が入っていると、空白になってしまいます。
%xxの部分は、
---
switch(inputdata[i]){
  case '%':
    tmp[0] = inputdata[++i];
    tmp[1] = inputdata[++i];
    tmp[2] = '\0';
    sscanf(tmp,"%x",outputdata[j]);
    break;
---
のようにデコードしています。
その後、sjisになおして表示するようにしてあります。sjisになおすのは、前薗 さんのHPの中にあったサンプルプログラムを、参考に
C++表現の一部をCの表現になおして使っています。

hkawa さんからのコメント
( Monday, December 16, 1996 21:17:05 )

書き足りない部分があったので追加します。

このプログラムでは、入力を先に分割して、リストにしまっておき、
出来上がった各要素をそれそれエンコードしていくように作ってあります。(UNIXからの移植なもんで)

あと、デバッグのためにDetectCode関数の返り値を表示するようにしたら、
すべてアスキーコードになっているんですが.....
前薗 さんのプログラムを活用している人で、わかるひとがいたらおしえてください!!

前薗 健一 さんからのコメント
( Monday, December 16, 1996 23:21:29 )

hkawa さん、はじめまして。

>sscanf(tmp,"%x",outputdata[j]);

sscanf( &outputdata[j],"%02x", tmp);

の間違いではないでしょうか?

hkawa さんからのコメント
( Friday, December 20, 1996 17:23:00 )

ありゃま、はずかしー
そのとおりですね。
失礼しました。

前薗 健一 さんからのコメント
( Friday, December 20, 1996 20:09:13 )

試していないのですが、よく考えてみたら

>sscanf( &outputdata[j],"%02x", tmp);

では tmp の address が &outputdata[j] に入ってしまいますね。 (^^;

sscanf( &outputdata[j],"%02x", ( short )*tmp);

かもしれません。 (^^;;

hkawa さんからのコメント
( Saturday, December 21, 1996 13:14:27 )

コンパイラはCodeWarriorCW9を使っているのですが、
     IsSiftJISは定義されていません
というエラーが出るんですが、どうしたらよいか分からないでしょうか?
ヘッダファイル LArray.h というファイルは、C++でプログラムを書かないと使えないのですか?
ヘッダファイル LArray.h を取り込むと、エラーが止まらなくなるので.....
毎度わかりにくい質問ばかりで恐縮ですが、よろしく助けて下さい---。

前薗 健一 さんからのコメント
( Saturday, December 21, 1996 20:59:23 )

>     IsSiftJISは定義されていません
プロトタイプ宣言がない時に出るエラーです。

>LArray.h というファイルは、C++でプログラムを書かないと使えないのですか?
質問の意味がよく判らないのですが、LArray クラスを使うのであれば必要ですし
そでなければ必要ありません。