cgi:XMLHttpRequestを送信してもヘッダしか送信されない

[戻る]
Alq3 2010/12/11(土) 12:22:39
お世話になっております。

開発環境:VC2005+vistaSP2(UNICODE使用)にてcgiを作成しております。
テスト環境はapache2.2でlocalhost+IE8を使っています。

クライアント側のhtmlからXMLHttpRequestによりC++で作成されたcgiと通信をしている
のですが、
void _tmain(){
 wcout << _T("Content-Type: text/plain; charset=utf-8\n\n");//送信されている
 wcout << _T("通信成功");//この部分が送信されてほしいのに送信されない
 return 0;
}
とすると、ヘッダ部分は正常に送信できているのですが、肝心のテキストが送信されて
おりません。
ヘッダ部分のクライアント側でXMLHttpRequest.getAllResponseHeaders()を表示させる
とContent-Lengthが0になっております。(Content-Typeがtext/plainに、charsetがutf-
8になっているのでヘッダ部分は送信できていると思われる。)
どのようにすれば肝心のテキスト部分を送信できるのでしょうか?
ご存知の方おられましたらご教授お願いいたします。

Alq3 2010/12/11(土) 12:41:43
追記:
その他の追試も行っておりましたので結果を掲載しておきます。

void _tmain(){
 wcout << _T("Content-Type: text/plain; charset=utf-8\n\n");
 wcout << _T("a");//OK
 return 0;
}

void _tmain(){
 wcout << _T("Content-Type: text/plain; charset=utf-8\n\n");
 wcout <<"a";//OK
 return 0;
}

void _tmain(){
 wcout << _T("Content-Type: text/plain; charset=utf-8\n\n");
 wcout <<"あ";//送信はされるが文字化けする
 return 0;
}

void _tmain(){
 wcout << _T("Content-Type: text/plain; charset=utf-8\n\n");
 wcout <<_T("あ");//送信さえされない?(Content-Length: 0)
 return 0;
}

となっております。
半角では送信される以上文字コード関連の問題と思うのですが…

επιστημη [E-Mail] [HomePage] 2010/12/12(日) 00:46:49
> wcout <<_T("あ");//送信さえされない?(Content-Length: 0)

UTF-8で送信してないんでしょう。

tetrapod 2010/12/13(月) 11:43:10
別に CGI に限った話ではなくて、コンソールアプリケーションでも再現できる。

・歴史的に [日本語Windows] の入出力コードは CP932 (shift-jis)
・_UNICODE 指定時の _T("あ") は UTF-16 として扱われる
・現代 Windows の内部コードは UTF-16

という事情から wcout で標準出力へ、ないしは wcin で標準入力から、
wchar_t を入出力する場合は UTF-16 ⇔ CP932 の自動変換を行うのが便利、と
一般的にみなされている。

上記は日本語 Windows の場合であって、中国語 Windows ではまた事情が異なり、
入出力コードは簡体字で GB2312 (EUC-CN) 繁体字で Big5 となっている。
UTF-16 ⇔ GB2312 や UTF-16 ⇔ Big5 の自動変換を行うのが以下略。

そのため wcout に対する入出力時には必ず locale (地域指定) が必要になり、
地域指定すると自動変換を行い、地域指定なしではエラーになるのが仕様。

wcout <<_T("あ"); // を実行すると
地域指定なしだと内部エラーで0文字出力となる [提示挙動]
地域指定ありだと当該地域向け標準文字コードになる
という挙動を示す。
(地域はプログラムで明示することもできるし、
コントロールパネルの設定値を使って Windows の標準地域を使うこともできる)

入出力コードとして UTF-8 を使いたい場合、どうするとよいのか・・・は
実はまだ調べ切れていない・・・

setlocale(LC_ALL, ".65001"); は受け付けてくれないことだけは調査済み。

Alq3 2010/12/14(火) 23:15:24
[[解決]]
>επιστημη様
>tetrapod様

ご回答ありがとうございます。
Unicode(=utf-16)とutf-8を完全に混同しておりました。
完全に勘違いした質問を投稿してしまったようです。
調査不足でした。解決とさせていただきます。

しかし、utf-8を簡単に扱えるライブラリって意外にもないのですね。
結局のところUnicode、もしくはShift-JISを経由する以外に方法がないわけですか…
う〜む。ややこしい。

古いスレッドには追加発言できません。