DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データが意図しない結果になる

環境/言語:[Windows XP c.>NET Framework1.0,j2sdk1-3]
分類:[ASP.NET]

こんばんは、
先日、javaで作ったiアプリからC#のASP.NETで作ったWebフォームにhttp通信でURLの後ろにつけてデータを送り(今はローカルネットで試しています)文字化けがするという質問をしたものです。文字化けの原因がわかりました。ありがとうございます。
今回は同じ通信方法で、iアプリのほうで「テスト」という文字列をURLエンコードして(エンコード結果は%83%65%83%58%83%67)、C#のASP.NETで作ったWebファームでURLデコードせずに表示したいのですが、結果は「eXg」になってしまいます。
まずjavaで
String dataString="テスト";
dataString=URLEncoder.encode(dataString);

HttpConnection httpc=(HttpConnection)Connector.open("http://localhost/testsetuzoku/WebForm1.aspx?FullName="+dataString,Connector.READ_WRITE,true);
以下省略

というプログラムを作りました。

受け取り側のC#のASP.NETのWebフォームでは

private void Page_Load(object sender, System.EventArgs e)
{
TextBox1.Text = Request.QueryString["FullName"];
String path=Request.MapPath("test.txt");
StreamWriter writer=new StreamWriter(path);
writer.write(TextBox1.Text);
writer.close();
}
というプログラムを作りました。ファイルに書き出したのは内容を確認するためです。アドバイスをお願いします。よろしくお願いします。

環境
j2sdk-1.3,DoJa-3.5,C#2003,
前スレのこれのことだよね?
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=13865&no=0

原因はなんだったの?
本来は向こうに報告して欲しいなぁ。

こんばんは、はいこーん様
返事遅れてすいません

> 原因はなんだったの?
原因はiアプリの方でURLエンコードした値をC#のASP.NETで作ったWebフォームにおくると、その値が変わってしまうからです。うまく説明できませんが下のサイトを参考にしました。
http://senrigan.ddo.jp/candid/urlencode.html

> 本来は向こうに報告して欲しいなぁ。
すいません。もう少しここのサイトの勉強をします。
■No14017に返信(kakeruさんの記事)
> 今回は同じ通信方法で、iアプリのほうで「テスト」という文字列をURLエン
> コードして(エンコード結果は%83%65%83%58%83%67)、C#のASP.NETで作った
> WebファームでURLデコードせずに表示したいのですが、結果は「eXg」になっ
> てしまいます。

先日のトピック(No13865)での問題と同じ問題だと思います。

そもそも、HttpRequest.QueryString プロパティから得られるクエリ文字列は、
URL エンコーディングがデコードされた後の文字列です。このデコード処理は、
既定ではクエリ文字列の符号化方式が UTF-8 であるものとして行われます。

kakeru さんの記事にあるエンコード結果をみると、クエリ文字列の符号化方式
は Shift_JIS ですから、文字化けするのも当然ですよね。


こんばんは、返事遅れてすいません。

> そもそも、HttpRequest.QueryString プロパティから得られるクエリ文字列は、
> URL エンコーディングがデコードされた後の文字列です。このデコード処理は、
> 既定ではクエリ文字列の符号化方式が UTF-8 であるものとして行われます。
>
> kakeru さんの記事にあるエンコード結果をみると、クエリ文字列の符号化方式
> は Shift_JIS ですから、文字化けするのも当然ですよね
おおたさん回答ありがとうございます。
これで原因がわかりました。ちなみにこの回避方法などがありましたら、アドバイスをお願いしたいのですが・・・。今つかっている言語、環境は変えずにプログラムだけで対処できないものですか?よろしくお願いします。
■No14056に返信(kakeruさんの記事)
> これで原因がわかりました。ちなみにこの回避方法などがありましたら、ア
> ドバイスをお願いしたいのですが・・・。今つかっている言語、環境は変え
> ずにプログラムだけで対処できないものですか?よろしくお願いします。

ASP.NET 側で対処するなら、ASP.NET がクエリ文字列に期待している符号化方
式を、UTF-8 から Shift_JIS に変更する方法が自然だと思います。符号化方式
は ASP.NET 構成ファイルの globalization 要素で指定できます。

<globalization> 要素
http://msdn.microsoft.com/library/ja/cpgenref/html/gngrfglobalizationsection.asp

おおたさん、返事おくれてすいません。
こんにちは、

> そもそも、HttpRequest.QueryString プロパティから得られるクエリ文字列は、
> URL エンコーディングがデコードされた後の文字列です。このデコード処理は、
> 既定ではクエリ文字列の符号化方式が UTF-8 であるものとして行われます。

私なりに研究してiアプリのほうでURLエンコードした値(仮に%83%65)の「%]を「/]に変更して(/83/65)にしてURLの後ろにつけて送りました。
受け側のWebフォームで

string str;

TextBox1.text=HttpRequest.QueryString["FullName"];
TextBox1.Text =TextBox1.Text .Replace ("/","%");
byte [] bytedata=System.Text .Encoding .Default .GetBytes (TextBox1.text);
str=HttpUtility.UrlDecode(bytedata,0,bytedata.Length ,System.Text .Encoding .Default );

というプログラムを作りました。結果文字化けもせずに表示できました。
おおたさんのアドバイスのおかげです。ありがとうございました。

> ASP.NET 側で対処するなら、ASP.NET がクエリ文字列に期待している符号化方
> 式を、UTF-8 から Shift_JIS に変更する方法が自然だと思います。符号化方式
> は ASP.NET 構成ファイルの globalization 要素で指定できます。

この方法でも確認してみたいと思います。この方法がベストな感じがしますね。本当にありがとうございました。
解決済み!
こんばんは、


> ASP.NET 側で対処するなら、ASP.NET がクエリ文字列に期待している符号化方
> 式を、UTF-8 から Shift_JIS に変更する方法が自然だと思います。符号化方式
> は ASP.NET 構成ファイルの globalization 要素で指定できます。

おおたさんから教えていただいたことを試したら文字化けせずにできました。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板