するプログラムを作っている途中で疑問箇所があります。
まず、クライアントというか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で質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
- UNIX・Linux sedでの正規化 2 2022/05/10 11:39
- 英語 "this day"が当日か今日を表すのかの使い分け方等について 5 2023/08/08 14:29
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WSH(VBS)でJSONの文字列を読み...
-
C++で文字列の右端から特定の文...
-
%dなどの違い
-
バイナリファイル中の日本語文...
-
16進数を2文字ずつ配列に格納し...
-
C言語のコンパイル時に表示され...
-
C++で入力した文字列から数字を...
-
VBA-DLLの引数受け渡しについて
-
_tcscpy_s(wcscpy_s)の第二引数...
-
2進数を10進数へ変換したいの...
-
PIC18F26K22でsscanf関数を使い...
-
#include <stdio.h> int main(v...
-
関数から配列を返すには?
-
C言語 配列の長さの上限
-
セグメントエラー
-
C言語のintとcharの違いってな...
-
mallocについて
-
C言語のポインタに直接アドレス...
-
fopne で失敗する原因
-
VBAのプログラムで、DIAG = 1# ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
C++で文字列の右端から特定の文...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
構造体→文字列→構造体 をする方法
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
-
C言語の課題で困っています;
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
おすすめ情報