するプログラムを作っている途中で疑問箇所があります。
まず、クライアントというかC# GUI側のコードなのですが
以下、実際にHTTPリクエストを送る箇所のみですが
this.postData = "value=" + HttpUtility.UrlEncode(this.box_01.Text,this.encode) + "&key=" + HttpUtility.UrlEncode(this.box_02.Text,this.encode);
//this.postData = "test=日本語テスト";
//==========================================================
//バイト配列型に変換※URLエンコード済みの文字列をアスキー文字列に変換
//==========================================================
this.postDataBytes = Encoding.ASCII.GetBytes(this.postData);
MessageBox.Show(this.postData);
//MessageBox.Show(this.postDataBytes);
string temp = "";
for(int i = 0; i < this.postDataBytes.Length; i ++){
temp += (char)postDataBytes[i];
}
MessageBox.Show(HttpUtility.UrlDecode(temp)); //デバッグ
//引数に通信先URLを指定してWebRequestクラスのインスタンスを作成
//httpリクエストインスタンスを作成
this.http = WebRequest.Create (url);
this.http.Method = "POST"; //メソッドの指定
this.http.ContentType = "application/x-www-form-urlencoded"; //ContentTypeの指定(※必須)
//送信するデータの長さを指定
this.http.ContentLength = this.postDataBytes.Length;
MessageBox.Show(this.http.ContentLength.ToString());
//データ送信用のストリーム
this.requestStream = http.GetRequestStream();
//送信するデータを書き込む
this.requestStream.Write(this.postDataBytes,0,this.postDataBytes.Length);
//送信終了
this.requestStream.Close();
//サーバーからの応答を取得
this.response = http.GetResponse();
Stream reponseStream = this.response.GetResponseStream();
StreamReader sr = new StreamReader(reponseStream,this.encode);
MessageBox.Show(sr.ReadToEnd());
sr.Close();
MessageBox.Show (this.box_01.Text);
まずGUI側の流れとしてはFormの中に二つのTextBoxを配置し二つの入力された値を
urlencodeして一般的?なHTTPリクエストのクエリ状態にしてます。
で途中でthis.postDataBytes = Encoding.ASCII.GetBytes(this.postData);
という処理の箇所で、Urlencodeした文字列をアスキーコード?に変換しているようです。
実際に、コンソールに出力して、文字列が数字のみの配列になったのを確認しました。
そのまま、StreamWriterで書き込み・・送信しています。
で最終的にPHP側にHTTPリクエストして、レスポンスをMessageBoxで表示させます。
PHP側のソースですが
<?php
//$str = urldecode($_POST["value"]);
$str = $_POST["value"];
$str_01 = $_POST["key"];
$fp = fopen("./sharp.txt","w+");
fwrite($fp,$str.$str_01);
print "あなたの入力した内容は". $str."ですね\r\n";
print "keyの値は".$str_01."ですね";
?>
という記述をしており最終的にGUIのMessageBoxに表示されるのは
print "あなたの入力した内容は". $str."ですね\r\n";
print "keyの値は".$str_01."ですね";
この部分に、入力した値がはいった文字列が表示されます。
で上記の流れの中で、C#側で途中Urlencodeしてそれをアスキーコードに変換してます。
そのアスキー文字をPHP側にリクエストしているのですが、これってPHP側で勝手にアスキー文字をもとのurlencodeの状態に復元し、さらにurldecodeしてマルチバイトの文字の状態にまで復元して表示しているということなのでしょうか?
識者の方ご教授ください。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
>そのアスキー文字をPHP側にリクエストしているのですが、これってPHP側で勝手にアスキー文字をもとのurlencodeの状態に復元し、さらにurldecodeして
CとかC++のコンパイルって個人的に苦戦する印象があるので途中で追うのやめているから自信ないけど、たぶんそういうことやっていると思うよ、「PHP"で"書いたコード」ではなく「PHP自体の、Cで書かれたソースコード」に以下のような記述があるからね。
https://github.com/php/php-src/blob/master/main/ …
この辺追うのもおもしろそうだったけど、やめといた。
https://www.codeblog.org/blog/moriyoshi/20060314 …
#まったくGUIとかC#関係ありません(笑)
=================
ところで。
>マルチバイトの文字の状態にまで復元して表示しているということなのでしょうか?
の部分に個人的にちょっと引っかかったなー
$x = "abc";
ってさ、C#でいうと、
String x = "abc";
じゃなくて
byte[] x = System.Text.Encoding.ASCII.GetBytes("abc");
だと思うんだよなー 。文字列連結演算子も
public static String SomeOperator(String s1,String s2){
return s1.Concat(s2);
}
じゃなくて
public static byte[] SomeOperator(byte[] s1,byte[] s2){
byte[] retval = new byte[s1.Length + s2.Length);
s1.CopyTo(retval,0);
s2.CopyTo(retval,s1.Length);
return retval;
}
的なやつ。設定次第では外側でEncoding.GetStringを使っているから安全そうなことがあるだけで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムによく出てくるst...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
char型配列の最大要素数
-
C#でstringをポインタとして渡す
-
C++で入力した文字列から数字を...
-
WSH(VBS)でJSONの文字列を読み...
-
nullと""、\\0とEOFの違いにつ...
-
アルファベットの出て来た回数
-
C言語の課題で困っています;
-
アルファベットをカウント、
-
バイナリファイル中の日本語文...
-
[Excel VBA]デフォルトプロパティ
-
数字の入った配列をファイルへ...
-
シリアル通信で0x00を送信した...
-
C言語 配列の長さの上限
-
配列の要素数に変数を入れたい...
-
c言語のポインタへの文字列入力...
-
関数から配列を返すには?
-
配列を使わずに、変数名を動的...
-
C言語でのconstを返す関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムによく出てくるst...
-
nullと""、\\0とEOFの違いにつ...
-
C++で入力した文字列から数字を...
-
WSH(VBS)でJSONの文字列を読み...
-
C#でstringをポインタとして渡す
-
TCL言語で文字列検索方法を教え...
-
%dなどの違い
-
VB6.0でのバイナリデータの扱い...
-
16進数を2文字ずつ配列に格納し...
-
[C++]WCHARの1文字目しか表示で...
-
char型配列の最大要素数
-
_tcscpy_s(wcscpy_s)の第二引数...
-
シリアル通信で0x00を送信した...
-
Shift_JIS(16進)を文字に変換す...
-
sprintf関数について教えて下さ...
-
バイナリファイル中の日本語文...
-
構造体→文字列→構造体 をする方法
-
引用符と二重引用符
-
C言語の勉強しています。すみま...
-
文字列にある特定文字の数
おすすめ情報