こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#のGUIからサーバー側のPHPへ文字列を送信

するプログラムを作っている途中で疑問箇所があります。
まず、クライアントというか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してマルチバイトの文字の状態にまで復元して表示しているということなのでしょうか?
識者の方ご教授ください。
よろしくお願いします。

投稿日時 - 2011-11-05 14:49:15

QNo.7114661

困ってます

質問者が選んだベストアンサー

>そのアスキー文字をPHP側にリクエストしているのですが、これってPHP側で勝手にアスキー文字をもとのurlencodeの状態に復元し、さらにurldecodeして

CとかC++のコンパイルって個人的に苦戦する印象があるので途中で追うのやめているから自信ないけど、たぶんそういうことやっていると思うよ、「PHP"で"書いたコード」ではなく「PHP自体の、Cで書かれたソースコード」に以下のような記述があるからね。

https://github.com/php/php-src/blob/master/main/php_variables.c#L230

この辺追うのもおもしろそうだったけど、やめといた。
https://www.codeblog.org/blog/moriyoshi/20060314.html

#まったく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を使っているから安全そうなことがあるだけで。

投稿日時 - 2011-11-05 21:50:42

お礼

ありがとうございます。
参考にします。(

投稿日時 - 2011-11-06 15:37:51

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問