cgi:XMLHttpRequestを送信してもヘッダしか送信されない – プログラミング – Home

通知
すべてクリア

[解決済] cgi:XMLHttpRequestを送信してもヘッダしか送信されない


Alq3
 Alq3
(@Alq3)
ゲスト
結合: 15年前
投稿: 28
Topic starter  

お世話になっております。

開発環境: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
 Alq3
(@Alq3)
ゲスト
結合: 15年前
投稿: 28
Topic starter  

追記:
その他の追試も行っておりましたので結果を掲載しておきます。

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;
}

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 14年前
投稿: 40
 

> wcout <<_T(あ);//送信さえされない?(Content-Length: 0)

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

別に 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
 Alq3
(@Alq3)
ゲスト
結合: 15年前
投稿: 28
Topic starter  

>επιστημη様
>tetrapod様

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました