System.Web을 사용하지 않고 어떻게 UrlEncode합니까?


310

데이터에 대한 웹 사이트를 호출하는 Windows 클라이언트 응용 프로그램을 작성하려고합니다. 설치를 최소로 유지하려면 .NET Framework Client Profile에서 dll 만 사용하려고합니다 . 문제는 일부 매개 변수를 UrlEncode해야한다는 것입니다. 클라이언트 Pofile의 일부가 아닌 System.Web.dll을 가져 오지 않고이를 수행하는 쉬운 방법이 있습니까?


웹 사이트로 전화를 거는 방법을 보여줄 수 있습니까? 어쩌면 거기에서 할 수있는 일이있을 수 있습니다.
— Darin Dimitrov

호기심으로 System.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
— David O'Meara

1
더 많은 예제를 원하면 원하는 경우 자체 테스트 사례를 제공 할 수 있습니다. 다음은이를 실행하는 샘플과 차이점을 보여주는 다른 인코딩 방법입니다. dotnetfiddle.net/12IFw1
— Maslow

3
WebUtility.UrlEncode () 및 WebUtility.UrlDecode ()는 4.5 이상입니다. 4.0에는 존재하지 않습니다.
— Derek Kalweit

msdn 말한다 : "유니버설 Windows 플랫폼 : 4.5 이후 사용 가능, .NET Framework : 4.0 이후 사용 가능"
— Thymine

54

당신이 사용할 수있는

Uri.EscapeUriString ( http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx 참조 )


이것과 EscapeDataString 사이에 차이점이 있습니까?
— Martin Brown

3
EscapeUriString을 사용하려고합니다. EscapeUriString은 전체 URL (http : // 부분 포함)을 인코딩하려고 시도하지만 EscapeUriString은 어떤 부분을 실제로 인코딩해야하는지 이해합니다.
— Matthew Manela

1
나는이 인스턴스에서 URL을 get 매개 변수로 전달하고 싶을 때 EscapeDataString을 원할 것입니다. 이 인스턴스에서 URL을 추가하고 있습니다.
— Martin Brown

5
@MatthewManela 나는 당신의 Oct1 코멘트가 EscapeDataString이 인코딩을 시도 할 것임을
— Maslow

를 사용하지 마십시오 Uri.EscapeUriString. 인코딩해야 할 부분을 "이해"하지 않으며 실제로 일관 적으로 수행 할 수없는 무언가 (전체 URI 이스케이프 처리)를 잘못 시도한 것입니다. 자세한 설명 은 이 답변 을 참조하십시오 .
— Livven

20

여기에 대한 답변은 매우 좋지만 여전히 충분하지 않습니다.

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"
.....

EscapeUriStringEscapeDataString쿠키 데이터는 예약 문자 '='및을 포함 할 수 없으므로 URL을 인코딩하는 데 사용되는 반면 쿠키의 내용을 인코딩하는 데 사용됩니다 ';'.


여기에 좋은 분석 및 분석, 매우 도움이됩니다. 누구나 성능 벤치 마크를 알고 있거나 (세 가지 방법을 모두 비교하여) 알고있는 것이 좋을 경우
— Shaun Wilson

이것은 좋은 분석이며 테이크 아웃은 Uri.EscapeUriString전체 URI를 이스케이프하는 것이 일관되게 수행 할 수 없기 때문에 사용해서는 안됩니다 . 자세한 설명 은 이 답변 을 참조하십시오 .
— Livven

16

클라이언트 프로파일 System.dll에 클라이언트 프로파일 사용 가능 버전 인 System.Net.WebUtility 클래스가 있습니다. MSDN 링크는 다음과 같습니다.

Web 유틸리티


해당 클래스의 도움말 페이지에 "웹 요청을 처리 할 때 URL 인코딩 및 디코딩을위한 메소드를 제공합니다."라고 명시되어 있습니다. 메서드 이름을 제대로 지정하지 않았기 때문일 수 있습니다.
— 제임스 화이트

좋은 점, 말하기, 왜 당신은 형제에게 투표하지 않습니까;)이 투표는 2 년 동안 저를 괴롭 혔습니다! JK .. 그러나 솔직히 그게 내가 링크를 게시 한 이유 일 것이다. 불행히도 나는 마이크로 소프트의 문서에서 오류로 명성을 얻었을 것이다.
— Sprague

11
UrlEncode 및 UrlDecode가 4.5 버전의 .Net에서 WebUtility에만 추가 된 것 같습니다.
— 마틴 브라운

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 클래스는 웹 요청을 처리 할 때 URL 인코딩 및 디코딩을위한 메소드를 제공합니다. HttpUtility와 동일한 기능을 수행하지만 System.Web 네임 스페이스
— 벗어남

3
그것은 HtmlDecodes이기 때문에 잘못되었으며 질문과 같이 UrlEncode하지 않습니다. HTML 인코딩이 URL 인코딩과 다르기 때문에 HtmlEncode조차 잘못되었습니다.
— Martin Brown
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.