私はデータのためのWebサイトを呼び出すWindowsクライアントアプリケーションを書き込もうとしています。インストールを最小限に抑えるために、私は .NET Frameworkクライアントプロファイルのdll のみを使用しようとしています。問題は、いくつかのパラメータをUrlEncodeする必要があるということです、Client Pofileの一部ではないSystem.Web.dllをインポートせずにこれを行う簡単な方法はありますか?
System.Uri.EscapeUriString()
は特定の文字では問題になる可能性があります。私にとっては、文字列内の数字/ポンド記号の#記号でした。
それがあなたにとって問題であるならば、試みなさい:
System.Uri.EscapeDataString() //Works excellent with individual values
違いを説明するSO質問の回答は次のとおりです。
EscapeUriStringとEscapeDataStringの違いは何ですか?
また、あらゆる側面でUri.EscapeDataString()
を使用することをお勧めします。
.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
に変換します。
これを編集してテスト文字列に新しい文字を追加するか、コメントに残して編集してください。
あなたが使用することができます
Uri.EscapeUriString( http://msdn.Microsoft.com/en-us/library/system.uri.escapeuristring.aspxを参照 )
ここでの答えはとても良いですが、それでも私には不十分です。
0から255までのすべての文字についてUri.EscapeUriString
とUri.EscapeDataString
を比較する小さなループを書きました。
注:どちらの機能にも、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"
.....
Cookieデータには予約文字の'='
と';'
を含めてはいけないため、EscapeUriString
はURLのエンコードに使用し、EscapeDataString
はたとえばCookieのコンテンツのエンコードに使用します。
クライアントプロファイルSystem.dllに存在するクライアントプロファイル使用可能バージョンSystem.Net.WebUtilityクラスがあります。これがMSDNリンクです。
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);
}
System.Webを使用せずにUrlEncodeに:
String s = System.Net.WebUtility.UrlEncode(str);
//fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode
s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant());
詳細: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/