C #은 JavaScript의 encodeURIComponent ()와 동등합니까?


135

자바 스크립트에서 :

encodeURIComponent("©√") == "%C2%A9%E2%88%9A"

C # 응용 프로그램과 동등한 기능이 있습니까? HTML 문자를 이스케이프 처리하기 위해 사용했습니다.

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"&#" + ((int)m.Value[0]).ToString() + ";");

그러나 JS가 사용하는 올바른 16 진수 형식으로 일치를 변환하는 방법을 잘 모르겠습니다. 예를 들어이 코드는 다음과 같습니다.

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"%" + String.Format("{0:x}", ((int)m.Value[0])));

대신에 " %a9%221a"을 ( "©√"를) 반환합니다 "%C2%A9%E2%88%9A". 문자열을 바이트 또는 다른 것으로 분할해야하는 것 같습니다.

편집 : 이것은 윈도우 앱이다에서 사용할 수있는 유일한 항목 System.Web:있다 AspNetHostingPermission, AspNetHostingPermissionAttribute하고 AspNetHostingPermissionLevel.

답변:


217

Uri.EscapeDataString또는 HttpUtility.UrlEncodeURL의 일부인 문자열을 이스케이프 처리하는 올바른 방법입니다.

예를 들어 문자열을 보자 "Stack Overflow".

  • HttpUtility.UrlEncode("Stack Overflow") -> "Stack+Overflow"

  • Uri.EscapeUriString("Stack Overflow") -> "Stack%20Overflow"

  • Uri.EscapeDataString("Stack + Overflow")-> 또한 인코딩 "+" to "%2b"---->Stack%20%2B%20%20Overflow

URL의 실제 부분으로 사용될 때 마지막 문자열 만 정확합니다 (쿼리 문자열 매개 변수 중 하나의 값이 아닌)


내가 겪었던 주요 문제는 내 솔루션에서 System.Web에 대한 참조가 없었지만 EscapeUriString에 대해 알지 못했습니다. 감사합니다!
트래비스

53
encodeURIComponent ()와 달리 Uri.EscapeUriString ()은 "+"를 "% 2b"로 인코딩하지 않습니다. 대신 Uri.EscapeDataString ()을 사용하십시오.
jwaliszko

4
System.Web을 참조하지 않으려면 HttpUtility 대신 WebUtility를 사용하십시오. .NET Core에는 HttpUtility가 없습니다.
Steven De Kock

2
@Steve 마지막 단락을 굵게 표시 하시겠습니까? 이 페이지에서 알아야 할 가장 중요한 것으로 보이며 더 많은 가시성이 필요합니다.
Timo

또한 Uri.EscapeUriString와 Uri.EscapeDataString의 차이에 대한 자세한 설명은이 대답을 참조하십시오 stackoverflow.com/questions/4396598/...
제이슨

20

HttpUtility.HtmlEncode/ 디코딩
HttpUtility.UrlEncode/ 디코딩

System.Web프로젝트에서 사용할 수없는 어셈블리 에 대한 참조를 추가 할 수 있습니다


좀 더 구체적으로 말하면 : 이것은 Windows 응용 프로그램의 경우 System.Web에서 사용할 수있는 유일한 항목은 AspNetHostingPermission, AspNetHostingPermissionAttribute 및 AspNetHostingPermissionLevel입니다.
트래비스

5
System.Web 어셈블리에 대한 참조를 추가 할 수 있습니다
David Thibault

2
HtmlEncoding은 완전히 다른 것입니다. UrlEncode는 사용하지 말아야 할 비 감각 API입니다. 전체 URL을 인코딩하는 것은 이치에 맞지 않습니다 (실제로 값을 매개 변수로 사용하도록 인코딩하지 않으려는 경우가 아니라면 이것이 그렇지 않습니다). 인코딩 / 이스케이프의 요점은 예약 된 문자가 일반적인 의미없이 전달되어야한다는 것입니다 (예 :?는 쿼리를 식별하거나 쿼리 매개 변수를 구분 함). 이를 위해서는 UrlEncode가 보유 할 수없는 지식이 필요합니다.
Brandon Paddock

18

나는 C #을 위해 javascript의 encodeURIComponent와 완벽하게 호환되는 아날로그를 시도했지만 4 시간 동안 실험 한 후에 이것을 발견했다.

C # 코드 :

string a = "!@#$%^&*()_+ some text here али мамедов баку";
a = System.Web.HttpUtility.UrlEncode(a);
a = a.Replace("+", "%20");

결과 : ! % 40 % 23 % 24 % 25 % 5e % 26 * () _ % 2b % 20some % 20text % 20here % 20 % d0 % b0 % d0 % bb % d0 % b8 % 20 % d0 % bc % d0 % b0 % d0 % bc % d0 % b5 % d0 % b4 % d0 % be % d0 % b2 % 20 % d0 % b1 % d0 % b0 % d0 % ba % d1 % 83

Javascript의 decodeURLComponent ()로 디코딩 한 후;

당신은 이것을 얻을 것입니다 : ! @ # $ % ^ & * () _ + 여기에 일부 텍스트 али мамедов баку

관심을 가져 주셔서 감사합니다


2
작동하지만 Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")대신 사용할 수 있습니다 .
mklement0

실제로 Uri.EscapeDataString는 '('및 ')'문자를 인코딩하지만 HttpUtility.UrlEncode그렇지 않습니다.
Øystein Kolsrud

12

System.Uri.EscapeUriString ()은 아무것도하지 않는 것 같지만 System.Uri.Escape Data String ()은 저에게 효과적 이었습니다.


10

객체에 액세스 할 수없는 경우 Server.UrlEncode()또는 예 System.Web.HttpUtility.UrlEncode()를 들어 보십시오 Server. 어셈블리에 System.Uri.EscapeUriString()참조를 추가하지 않도록 사용할 수도 있습니다 System.Web.


1
아무것도하지 않는다 () Uri.EscapeUriString,하지만 난 () Uri.EscapeDataString 사용하여 제대로 URL 인코딩 문자열에 수 있었다
Toland 혼

3
@TolandHon : 참으로. 그 이유는 URI 예약 문자를 유지 Uri.EscapeUriString()하는 JavaScript에 해당하기 때문입니다 encodeURI(). ,, ...있는 그대로 (더하기 ) 와 같이 /, 발견 한 바와 같이, 이는 JavaScript와 일치합니다 . &#Uri.EscapeDataString()encodeURIComponent()
mklement0

8

Windows 스토어 앱의 경우 HttpUtility가 없습니다. 대신, 당신은 :

URI의 경우 '?'앞 :

  • 체계. Uri.EscapeUriString ( "example.com/Stack Overflow ++?")
    • -> "example.com/Stack%20Overflow++?"

'?'다음에 오는 URI 쿼리 이름 또는 값의 경우 :

  • 체계. Uri.EscapeDataString ( "스택 오버플로 ++")
    • -> "스택 % 20 오버플로 % 2B % 2B"

A의 x-www-form-urlencoded를 게시물 내용의 쿼리 이름 또는 값 :

  • System.Net. WebUtility.UrlEncode ( "스택 오버플로 ++")
    • -> "스택 + 오버플로 % 2B % 2B"

6

System.Web 네임 스페이스에서 Server 개체를 사용할 수 있습니다.

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode 및 Server.HtmlDecode.

편집 : 포스터는 이것이 웹 응용 프로그램이 아니라 웹 응용 프로그램이 아니라고 Windows 응용 프로그램이라고 덧붙였습니다. 위에 나열된 항목은 프로젝트에 대한 참조로 추가해야하는 System.Web의 HttpUtility 클래스에서 사용할 수 있습니다.


1
Windows 응용 프로그램에서 서버 개체에 액세스 할 수 없음
트래비스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.