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.