데이터에 대한 웹 사이트를 호출하는 Windows 클라이언트 응용 프로그램을 작성하려고합니다. 설치를 최소로 유지하려면 .NET Framework Client Profile에서 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/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"
.....
EscapeUriString
EscapeDataString
쿠키 데이터는 예약 문자 '='
및을 포함 할 수 없으므로 URL을 인코딩하는 데 사용되는 반면 쿠키의 내용을 인코딩하는 데 사용됩니다 ';'
.
답변
클라이언트 프로파일 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/