質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

2回答

1223閲覧

Ajax通信 POSTメソッドで送信したデータが文字化けしてしまいます

kit_break

総合スコア14

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2017/07/25 10:38

###現象
Ajax通信でJSONを送信を行いC++で作成したCGIで受信し文字列に保管するといった処理を行っています
ですが、Ajax側でコンソール上に表示すると文字化けしてしまいます

###該当のソースコード
int main()
{
// 環境変数[REQUEST_METHOD]に送信されたメソッド[GET/POST]が入ります。  
std::string request_method = getenv("REQUEST_METHOD");
if (request_method != "POST")
{
cout << "REQUEST_METHOD : " << request_method << endl;
return 0;
}

// 送信されたサイズを取得します。   const char* lengthStr = getenv("CONTENT_LENGTH"); int length = atoi(lengthStr); // 送信されたデータを保存する文字列のメモリを確保します。   char* tmpBuf = new char[length + 1]; if (!tmpBuf) { cout << "Allocate is failed." << endl; return 0; } // 標準入力からPOSTされたデータを取得します。   if (fread(tmpBuf, 1, length, stdin) != length) { cout << "fread is failed." << endl; return 0; } tmpBuf[length] = '\0'; string result = tmpBuf; const char* answer = "Content-Type:text/html;charset=Shift-JIS\n\n"; cout << answer << "{\"" << length << "\":" << "\"test\"}"; return 0;

}

Ajaxでは文字コードの指定をしていません

Ajax通信で送信するデータ
{test_message:0,title:"テスト",message:""};
コンソール上に表示される出力結果
{"json%5Btest_message%5D=0&json%5Btitle%5D=%E7%B9%9D%EF%BF%BD%E3%81%9B%E7%B9%9D%EF%BF%BD&json%5Bmessage%5D=データ長 : 105":"test"}

###試したこと
課題に対してアプローチしたことを記載してください
UTF-8⇔SHIFT-JISにデコードしてみましたが結果は変わりませんでした

###補足情報(言語/FW/ツール等のバージョンなど)
開発環境 visual studio 2017
サーバー Apache 2.4.25

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

その文字列はURL形式でエンコードされているようです。まずはURL形式から通常の文字コードへ変換しましょう。それはUTF-8で「テスト」になっているはずです。
そのままコマンドプロンプトへ出力すると「繝・せ繝・」と文字化けするので、UTF-8→Shift-JIS変換すれば良いはずです。

URLエンコード形式について私は把握していませんが、Wikipediaに簡単な記載があります。これを見る限りでは、%の次の2文字を16進数と解釈して文字列の1バイトへ単純変換すれば良さそうな感じです。


【追記】
すいません。違いました。
文字コードを見る限り、UTF-8でエンコードされた文字列をShift-JISと解釈してUTF-8へ無理やり変換するとそのようなコードになる筈です。
つまり、UTF-8の「テスト」=E38386 E382B9 E38388E383(繝) 86E3(無効) 82B9(せ) E383(繝) 88(無効)と解釈し、それをUTF-8へ変換しているものが送信されてきているデータのようです。
UTF-8のE7B99Dは「繝」です。

つまり、送信側で化けているので、そちらを修正しないと復元は難しいです。無効文字の対応が取れないはずですから。

投稿2017/07/25 13:14

編集2017/07/25 13:41
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

%decodeしましょう

投稿2017/07/25 11:16

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kit_break

2017/07/25 12:18

すみません デコードすればよいのはわかっているのですがデコードしても全角文字の部分が化けてしまったりしているのです。ソースに挙げたのは、受信したデータをそのまま表示しているのみです。 申し訳ないのですが、デコードの方法を教えてもらえませんか?
yumetodo

2017/07/25 12:21

あー、やっと問題を把握しました・・・うーむ
kit_break

2017/07/25 12:32

説明が足りず申し訳ありません。 最終的にはJSONとして扱いたいと考えていまして。。。 C++ではクラスや関数も参考になるものが少なく困っているんですよね( ノД`)
yumetodo

2017/07/25 12:36 編集

とりあえずjsonのデコードはpicojson使っとけと思いますが、この文字化けどっかでみたなぁ・・・
yumetodo

2017/07/25 14:00 編集

私のTLで問い合わせた結果↓ >https://twitter.com/kazatsuyu/status/889835246127951872 >両方やってるみたいだから送信側というべきか受信側と言うべきか分からないけど、ブラウザ側がShift_JISとして受信すれば文字化けの問題は解決。どちらが悪いかと言うとShift_JIS送るやつが悪い
yumetodo

2017/07/25 13:59

>https://mobile.twitter.com/akinomyoga/status/889847273575727105 >utf-8 "テスト" を sjis で解釈して Unicode にすると %E7 … %BD になる。JavaScript で動いている時点で全て UTF-16 なのでそれ以前の問題で、単に utf-8 な .js を sjis だと思ってブラウザがロードしている事の気がする
yumetodo

2017/07/25 14:01

結論:送信側のコード晒してそれから考えよう
kit_break

2017/07/25 23:15

返信ありがとうございます。では送信側はAjaxでformデータを送信しています jQuery . ajax({ url: 'プログラム.cgi', type:'POST', dataType: 'json', async: false, cache:false, data: {json:test }, succes : error : } 余談ですがJSPだと getParameter('json') とかでJSONを取得できるみたいなんです。 同じことをCGIではできないのでしょうか?
yumetodo

2017/07/26 03:25 編集

>送信側は http://shinimae.hatenablog.com/entry/2015/12/10/164401 全部UTF-8でやり取りしましょう。 >余談ですが 動的型付け言語と静的型付け言語を一緒くたにされても・・・。前述のとおりjsonのデコードはpicojsonを使えばいいと思います。
kit_break

2017/07/27 02:52

返信ありがとうございます。 UTF-8に設定してもダメでした。 自分でも探してみたんですが、文字化けしているというより "" とか @ [] などの文字がアスキーコードに置き換わっているみたいなんです。原因なのですが、CGIで fread で 1byte 毎に文字を取得している処理が悪いのでしょうか?もしそうならば、どのようにPOSTデータを取得すればよいのでしょうか?
yumetodo

2017/07/27 03:05

>CGIで fread で 1byte 毎に文字を取得している処理 なんのこと・・・? >"" とか @ [] などの文字がアスキーコード %encodeしてるんだからそりゃそうでしょ >UTF-8に設定してもダメでした。 送信側のすべてファイル、Apacheの設定、送信時のMINEの指定がUTF-8かもう一度確認してください。それでダメならちょっと私にはお手上げ・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問