お世話になっております。
開発環境: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になっているのでヘッダ部分は送信できていると思われる。)
どのようにすれば肝心のテキスト部分を送信できるのでしょうか?
ご存知の方おられましたらご教授お願いいたします。
追記:
その他の追試も行っておりましたので結果を掲載しておきます。
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;
}
となっております。
半角では送信される以上文字コード関連の問題と思うのですが…
> wcout <<_T(あ);//送信さえされない?(Content-Length: 0)
UTF-8で送信してないんでしょう。
別に 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); は受け付けてくれないことだけは調査済み。
>επιστημη様
>tetrapod様
ご回答ありがとうございます。
Unicode(=utf-16)とutf-8を完全に混同しておりました。
完全に勘違いした質問を投稿してしまったようです。
調査不足でした。解決とさせていただきます。
しかし、utf-8を簡単に扱えるライブラリって意外にもないのですね。
結局のところUnicode、もしくはShift-JISを経由する以外に方法がないわけですか…
う~む。ややこしい。