この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 16446|答える: 2

[ASP.NET] ASP.NET におけるURLエンコードとデコード

[リンクをコピー]
掲載地 2016/01/12 13:04:21 | | | |

次の2つのURLを見てみましょう。同じパラメータを通していますか?
aaa.aspx?tag=.net%bc%bc%ca%f5
aaa.aspx?tag=.net%e6%8a%80%e6%9c%af

違うように見えますが、実際にはすべて「.net技術」としてUrlEncodeを使っています。ただし、1つはGB2312エンコーディング、もう1つはUtf-8エンコーディングです。
以下のコードは上記の符号化効果を得ることができます:

string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312"));
string tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);

当社のウェブページは他のプログラムから呼び出されることがあります。
例えば、オペレーティングシステムのASPページは中国語簡体化で、ASP.net ページに中国語パラメータを渡す必要があります。
デフォルトでは、中国簡体字OSでは、ASPのServer.UrlEncodeメソッドが中国語をGB2312エンコーディングでエンコードします。
しかしデフォルトでは、ASP.net ページはUTF-8でエンコードされています。
この場合、Request.QueryString["Tag"]を使って値を受け入れると、中国語の情報は受け入れられず、ステップバイステップのデバッグで文字が乱れているのが見えます。
現時点では、Request.QueryString["Tag"]は文字が乱れていても受け入れられますが、URL自体は乱れていません。

解決策は、URL内のパラメータを自分で解析し、デフォルトのUTF-8エンコーディングではなくGB2312のエンコーディングに従ってパラメータの値を復号することです。
実際、Microsoftも対応する関数を提供しているため、私たち自身で正則表現を使ってURL文字列を解析する必要はありません。

デモコードは以下の通りです:

string q = Request.Url.Query;

System.Collections.Specialized.NameValueCollection nv =
System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312"));
Response.Write(nv["Tag"]);

Lutz Roederの.NET Reflectorを使ってSystem.Web.HttpUtility.ParseQueryStringメソッドの実装を見てみましょう。
繰り返し確認すると、URLパラメータ文字列解析を最終的に扱うコードは以下の通りです。

System.Web.HttpValueCollectionクラスの以下の関数はURLパラメータの解析を実装しています
ここでは、各キャラクターが分析を行うことがわかります。

  1. internal void FillFromString(string s, bool urlencoded, Encoding encoding)
  2. {
  3.       int num1 = (s != null) ? s.Length : 0;
  4.       for (int num2 = 0; num2 < num1; num2++)
  5.       {
  6.             int num3 = num2;
  7.             int num4 = -1;
  8.             while (num2 < num1)
  9.             {
  10.                   switch (s[num2])
  11.                   {
  12.                         case ’=’:
  13.                               if (num4 < 0)
  14.                               {
  15.                                     num4 = num2;
  16.                               }
  17.                               break;
  18.                   }
  19.                   num2++;
  20.             }
  21.             string text1 = null;
  22.             string text2 = null;
  23.             if (num4 >= 0)
  24.             {
  25.                   text1 = s.Substring(num3, num4 - num3);
  26.                   text2 = s.Substring(num4 + 1, (num2 - num4) - 1);
  27.             }
  28.             else
  29.             {
  30.                   text2 = s.Substring(num3, num2 - num3);
  31.             }
  32.             if (urlencoded)
  33.             {
  34.                   base.Add(HttpUtility.UrlDecode(text1, encoding), HttpUtility.UrlDecode(text2, encoding));
  35.             }
  36.             else
  37.             {
  38.                   base.Add(text1, text2);
  39.             }
  40.             if ((num2 == (num1 - 1)) && (s[num2] == ’&’))
  41.             {
  42.                   base.Add(null, string.Empty);
  43.             }
  44.       }
  45. }
コードをコピーします


相手が私たちに渡すエンコーディング方法については、パラメータとして渡すのが最善であり、ユーザーのパラメータに従って復号できるからです。




先の:家をスタジオに飾って作業するつもり?
次に:AssemblyInfo.csファイルのパラメータの具体的な説明
 地主| 掲載地 2024/12/04 17:15:50 |
.NET Core URL エンコーディングとデコード

 地主| 掲載地 2024/12/04 17:35:32 |
異なる文字セットは以下のようにエンコードされています:



コード:



免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com