System.Web を使用せずに URLEncode を行うにはどうすればよいですか?
-
27-09-2019 - |
質問
Web サイトを呼び出してデータを取得する Windows クライアント アプリケーションを作成しようとしています。インストールを最小限に抑えるために、私はのみを使用しようとしています .NET Framework クライアント プロファイルの DLL. 。問題は、いくつかのパラメータを UrlEncode する必要があることです。クライアント 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 /ライブラリ/ 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"
.....
EscapeUriString
EscapeDataString
クッキーデータが予約文字'='
と';'
が含まれていなければならないので、クッキーの内容例えば、エンコードするために使用されるが、符号化URLに使用される。
クライアントプロファイル使用可能なバージョン、System.Net.WebUtilityクラス、クライアントプロファイルSystem.dllの中に存在があります。ここでは、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);
}
にURLENCODEのSystem.Webを使用しない:
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/25 /注意-webutility-でurlencode-VS-httputility-でurlencode / の
System.Net.WebUtility.HtmlDecode