System.Webを使用せずにUrlEncodeをどのように実行しますか?


310

Webサイトを呼び出してデータを取得するWindowsクライアントアプリケーションを作成しようとしています。インストールを最小限に抑えるために、私は.NET Framework Client ProfileでDLLのみを使用しようとしています。問題は、いくつかのパラメーターをUrlEncodeする必要があることです。クライアントPofileの一部ではないSystem.Web.dllをインポートせずにこれを行う簡単な方法はありますか?


Webサイトへの呼び出しをどのように実行していますか?たぶん、そこでできることがあるでしょう。
Darin Dimitrov

好奇心から、System.Webを使用せずにデータのWebサイトをどのように呼び出しますか?
Patrick McDonald、

@パトリック、彼はおそらくWebRequestまたはを使用していWebClientます。これが、この特定のコードについて私が尋ねた理由です。データを適切にURLエンコードするために実行できることがあるからです。
Darin Dimitrov

1
System.Net.WebRequestオブジェクトを使用しています。次に、GetRequestStreamを呼び出し、Postパラメーターをストリームに書き込みます。また、ContentTypeを "application / x-www-form-urlencoded"に設定しました。
Martin Brown、

1
もちろん、私がGETリクエストを実行してURLにパラメーターを追加する場合も同様に当てはまります。
Martin Brown、

回答:


317

System.Uri.EscapeUriString() 特定の文字で問題が発生する可能性があります。私にとっては、文字列内の数字/ポンド記号「#」でした。

それが問題である場合は、以下を試してください。

System.Uri.EscapeDataString() //Works excellent with individual values

これが違いを説明するSOの質問の答えです:

EscapeUriStringとEscapeDataStringの違いは何ですか?

そしてUri.EscapeDataString()、あらゆる面で使用することをお勧めします。


1
False:blogs.msdn.com/b/yangxind/archive/2006/11/09/…プラス記号はエンコードされないため、プラス記号で問題が発生します。
Chris Weber

7
そのブログ投稿は少し古く、私は完全なURLを "Uri Escaped"していて、すべてのスペースが%20になっているので、修正したと思います。.Net 4.5を使用しています。
Rodi

また、POST操作用にデータを準備している場合、EscapeDataStringは非常に長い文字列をサポートしません。 stackoverflow.com/questions/6695208/...
ブロンデイヴィス

Uri.EscapeUriString確かに非常に問題があり、一貫して行うことが実際には不可能である(完全なURIをエスケープする)ことを試みるため、使用しないでください。詳細な説明については、この回答を参照してください。
Livven

また、 ''スペース文字。
Waqas Shabbir

252

.Net 4.5以降で使用 WebUtility

書式設定のためだけに、これを回答として提出します。

それらを比較する良い例を見つけることができませんでした:

string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode:         " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString:   " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString:  " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));

Console.WriteLine("HtmlEncode:        " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode:     " + System.Web.HttpUtility.UrlPathEncode(testString));

//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode:  " + WebUtility.UrlEncode(testString));

出力:

UrlEncode:             http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString:       http://test#%20space%20123/text?var=val&another=two
EscapeDataString:      http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace:     http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

HtmlEncode:            http://test# space 123/text?var=val&another=two
UrlPathEncode:         http://test#%20space%20123/text?var=val&another=two

//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode:  http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

.Net 4.5以降で使用 WebUtility.UrlEncode

これHttpUtility.UrlEncodeは、より一般的な文字に対して(v4.0より前)を複製するように見えます。
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
注:EscapeUriString有効なuri文字列が保持されるため、できるだけ多くのプレーンテキスト文字が使用されます。

さまざまなエンコーディングを比較した表については、この回答を参照してください:https :
//stackoverflow.com/a/11236038/555798

改行 ここにリストされているすべて(以外HttpUtility.HtmlEncode)はまたはに変換"\n\r"されます%0a%0d%0A%0D

これを編集してテスト文字列に新しい文字を追加するか、コメントに残して自由に編集してください。


私の場合は私が使用していたEscapeDataStringのではなくEscapeUriString、我々はキャリッジリターンとラインフィードとをコードし、これらの必要によって行わエスケープより積極的なEscapeDataString
デヴィッド・オメーラ

1
その他の例として、必要に応じて独自のテストケースを提供できます。これを実行するサンプルと、違いを示す他のエンコード方法の例を次に
Maslow

3
WebUtility.UrlEncode()およびWebUtility.UrlDecode()は4.5以降です。それらは4.0には存在しません。
Derek Kalweit 2016

msdnによると、「ユニバーサルWindowsプラットフォーム:4.5以降で利用可能、.NET Framework:4.0以降で利用可能」...
Thymine

54

これとEscapeDataStringの間に違いはありますか?
Martin Brown、

3
EscapeUriStringを使用したい。EscapeUriStringはURL全体(http://の部分を含む)をエンコードしようとしますが、EscapeUriStringは実際にエンコードする必要がある部分を理解します
Matthew Manela

1
なるほど、このインスタンスでは、URLをgetパラメータとして渡したいので、おそらくEscapeDataStringが必要になるでしょう。この例では、URLに追加しています。
Martin Brown、

5
@MatthewManela私はかなり確信して、あなたのOCT1のコメントは読むべきだEscapeDataStringを...エンコードしようとします
マズロー

使用しないでくださいUri.EscapeUriString。エンコードする必要のある部分を「理解」するのではなく、実際に一貫して行うことは不可能である(完全なURIをエスケープする)何かを行うための誤った試みです。詳細な説明については、この回答を参照してください。
Livven

20

ここでの答えは非常に良いですが、それでも私には不十分です。

私は比較し、小さなループ書いUri.EscapeUriStringUri.EscapeDataString0から255までのすべての文字列についてを。

注:どちらの関数にも、0x80を超える文字が最初にUTF-8エンコードされ、次にパーセントエンコードされるという組み込みのインテリジェンスがあります。

結果は次のとおりです。

******* Different *******

'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"


******* Not escaped *******

'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"

'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"

'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"

'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"

******* UTF 8 *******

.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....

EscapeUriStringは、URLをエンコードするために使用されますが、EscapeDataStringCookieデータには予約文字'='やを含めることはできないため、は、たとえばCookieのコンテンツをエンコードするために使用され';'ます。


ここでの素晴らしい分析と内訳は、非常に役立ちます。パフォーマンスベンチマーク(3つの方法すべてを比較)を持っているか知っている場合は、これも見るのが良いでしょう
Shaun Wilson

これは優れた分析であり、重要なのは、Uri.EscapeUriString完全なURIをエスケープすることを一貫して行うことは不可能であるため、を使用してはならないということです。詳細な説明については、この回答を参照してください。
Livven

16

クライアントプロファイルのSystem.dllには、クライアントプロファイルの使用可能なバージョンSystem.Net.WebUtilityクラスがあります。これがMSDNリンクです:

WebUtility


そのクラスのヘルプページには、「Webリクエストの処理時にURLをエンコードおよびデコードするためのメソッドが用意されています」と具体的に記載されていることに注意します。そのため、メソッドの名前が適切ではなかった可能性があります。
ジェームズホワイト

良い点は、どうして兄弟に賛成票を投じないかということです;)この反対票は2年間私を悩ませてきました。JK ...しかし、正直に言って、私がリンクを投稿したのはおそらくそのためです。残念ながら、マイクロソフトのドキュメントのエラーで評判が悪かったのです...
Sprague

11
UrlEncodeとUrlDecodeは、4.5バージョンの.NetでのみWebUtilityに追加されたようです。
Martin Brown、

8

次に、application/x-www-form-urlencodedコンテンツタイプを使用してパラメータを適切にエンコードするPOSTリクエストを送信する例を示します 。

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "param1", "value1" },
        { "param2", "value2" },
    };
    var result = client.UploadValues("http://foo.com", values);
}


-3
System.Net.WebUtility.HtmlDecode

WebUtilityクラスは、Webリクエストを処理するときにURLをエンコードおよびデコードするためのメソッドを提供します。HttpUtilityと同じことを行いますが、System.Web名前空間の外にあります
Alexandru Aliu

3
HtmlDecodeを実行し、質問のようにUrlEncodeを実行しないため、誤りです。HTMLエンコーディングはURLエンコーディングとは異なるため、HtmlEncodeでも問題があります。
マーティンブラウン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.