QA@IT

Visual C++ / C++/cliのHTTPクライアント不備

2945 PV

Visual C++ / C++/cliのHTTPクライアントを作成しているが、
うまくいかないURLがあります。

■概要
http://a.com」へアクセスしてレスポンスbodyを見ると、
文字化けした文字が1文字のみ(�)入っていて、正常にHTMLを取得できません。
なお「http://b.com」「http://c.com」などの他サイトの場合、正常にHTMLを取得できます。

■質問事項
上記が発生する原因と対策をご教授下さい。

■環境
Microsoft Visual Studio Community 2013 Update 4
Visual C++ / C++/cli
Windows8.1

■ソースコード
http://ideone.com/5nTej7

回答

以下の行でリクエストヘッダにAccept-Encoding:gzip, deflateをつけているようですが、レスポンスを読むときには解凍に対応していないようなので、これを外してみてはどうでしょうか。

ソースコード28行目

    req->Headers->Add("Accept-Encoding", "gzip, deflate");
編集 履歴 (1)

上手くいかないアドレスが無いので何とも言えませんが、ソースを見て気になった事は

  1. utf-8 固定である

    上手くいくサイト、上手くいかないサイトの文字コードとあっていますか?

  2. デバッグ出力時に各変数を結合して表示している。

    デバック表示関数(http->return_body + " " + http->return_header + " "  +  http->return_statuscord.ToString() + "\n");
    //★↑この表示が 文字化けした文字1文字のみ(�)となる  http->return_headerとhttp->return_statuscordは空NULL★
    

    http->return_statuscordは空NULL★ とありますが、空とnullは違います。 return_statuscord が仮にnullならばToStringで例外が発生するはずです。
    文字化けした文字と結合しているから(途中の\0がnull終端文字と解釈されるなどで)出力されずにそれをブランクであると勘違いしているだけではないでしょうか。各変数毎に一つずつ(そしてreturn_bodyは最後に)デバッグ表示関数を呼び出す様にしてみればステータスコードは表示されるかもしれません。


質問とは関係ないですが

  • ステータスコードのスペル はstatuscodeですね。
  • 存在しないURLを示したいときは example.com を使用した方がいいでしょう(修正投げた時に直し忘れましたが"http://content-available-to-author-only.example.com/"とか)。極端な話ですがそのドメインを悪意ある誰かが取得しまった場合に問題が起こる場合があり得ますので。example.comはプログラムの例示用ドメインで登録することはできなくなっています。
編集 履歴 (0)
  • ご指摘通り各変数毎に一つずつ(そしてreturn_bodyは最後に)デバッグ表示関数を呼び出す様にしてみたところ、ステータスコードとヘッダーは表示されるようになりました。

    が、さらに文字コードを別のもの Shift_JIS euc-jp にしても、
    やはり現象は解決しません。

    文字化け1文字だけでなく、通常のHTMLを取得するにはどうしたらいいのでしょうか。
    -
  • サイトのアドレス(提示可能なら)か文字コード(ブラウザで確認できるはず)、ステータスコードなど他の情報が分からないとなんとも言えません。 -
  • あとデバッグ表示関数というのもわからないですが、ちゃんと全角文字でも機能するんでしょうか?VSのデバッガでブレークできるなら、そちらでreturn_bodyの内容を確認してみてはどうでしょう。
    もしくは、C# でも試してみるとか。C# 書いたことがなくて書けない場合は、これくらいならソース変換してあげられますが。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。