Server.UrlEncode 대Http 유틸리티.UrlEncode
서버 간에 차이가 있습니까?UrlEncode 및 HttpUtility.URLEncode?
저는 이전에 이러한 방법들로 상당한 두통을 겪었습니다. 저는 당신이 어떤 변형도 피하고 대신에 적어도 이해할 수 있는 행동을 하는 것을 사용할 것을 권장합니다.
어디 보자꾸나...
HttpUtility.UrlEncode(" ") == "+" //breaks ASP.NET when used in paths, non-
//standard, undocumented.
Uri.EscapeUriString("a?b=e") == "a?b=e" // makes sense, but rarely what you
// want, since you still need to
// escape special characters yourself
하지만 제가 개인적으로 가장 좋아하는 것은 Http Utility입니다.UrlPathEncode - 이것은 정말 이해할 수 없습니다.다음을 인코딩:
- " " ==> "%20"
- "100% 참" ==> "100%% 20 참" (ok, 너의 URL은 지금 깨졌어)
- "test A.aspx #앵커 B" ==> "test%20A.aspx #앵커%20B"
- "test A.aspx?hmm#앵커 B" ==> "test%20A.aspx?hmm#앵커 B" (이전 이스케이프 시퀀스와의 차이점에 유의하십시오!)
또한 "웹 서버에서 클라이언트로 안정적인 HTTP 전송을 위해 URL 문자열의 경로 부분을 인코딩합니다."라는 내용의 MSDN 문서도 포함되어 있지만 실제로는 이 문자열이 수행하는 작업에 대해서는 설명하지 않습니다.당신은 우지로 당신의 발을 쏠 가능성이 적습니다.
간단히 말해서, 우리당을 고수하세요.데이터 문자열을 이스케이프합니다.
HttpServerUtility.UrlEncode
을 사용합니다.HttpUtility.UrlEncode
차이는 .특별한 차이는 없습니다.의 존재 Server.UrlEncode
클래식 ASP와 호환됩니다.
이 질문이 처음 제기된 지 거의 9년이 지났고 의 세계에서 빠르게 진행됩니다.NET Core 및 .NET Standard, URL 인코딩에 대한 가장 일반적인 옵션은 WebUtility인 것 같습니다.UrlEncode(아래)System.Net
) 및 우리당.데이터 문자열을 이스케이프합니다.여기와 다른 곳에서 가장 인기 있는 대답으로 판단하면, 우리당입니다.EscapeDataString이 더 좋은 것 같습니다.하지만 그럴까요?저는 차이점을 이해하기 위해 몇 가지 분석을 실시했고, 다음과 같은 결과를 얻었습니다.
WebUtility.UrlEncode
을 공간인딩으로 합니다.+
;Uri.EscapeDataString
니다합딩코로 합니다.%20
.Uri.EscapeDataString
백화부!
,(
,)
,그리고.*
;WebUtility.UrlEncode
하지 않다.WebUtility.UrlEncode
백화부~
;Uri.EscapeDataString
하지 않다.Uri.EscapeDataString
던지다, 던지다UriFormatException
긴; 65,000자 이상인 경우WebUtility.UrlEncode
그렇지 않습니다. (특히 URL 인코딩 폼 데이터를 처리할 때 생각보다 일반적인 문제입니다.)Uri.EscapeDataString
던지다, 던지다UriFormatException
높은 대리 캐릭터에;WebUtility.UrlEncode
그렇지 않습니다. (그것은 UTF-16의 일이고, 아마도 훨씬 덜 일반적일 것입니다.)
URL 인코딩을 위해 문자는 예약되지 않음(URL에서 합법적), 예약됨(법적이지만 특별한 의미가 있으므로 인코딩할 수 있음) 및 기타 모든 항목(항상 인코딩되어야 함)의 세 가지 범주 중 하나로 적합합니다.
RFC에 따르면 예약된 문자는 다음과 같습니다.:/?#[]@!$&'()*+,;=
그리고 예약되지 않은 문자는 영숫자이고-._~
평결
Uri.EscapeDataString은 미션을 명확하게 정의합니다. %-모든 예약된 문자와 잘못된 문자를 인코딩합니다.웹 유틸리티.UrlEncode는 정의와 구현 모두에서 더 모호합니다.이상하게도, 그것은 일부 예약된 문자는 인코딩하지만 다른 문자는 인코딩하지 않습니다(괄호가 아닌 괄호는 왜?). 그리고 낯선 사람은 여전히 순수하게 예약되지 않은 문자를 인코딩합니다.~
성격.
그러므로, 저는 URI를 사용하라는 대중적인 조언에 동의합니다.가능한 경우 DataString을 이스케이프하고 예약된 문자가 다음과 같은 것임을 이해합니다./
그리고.?
암호화됩니다.특히 URL로 인코딩된 양식 콘텐츠와 같이 잠재적으로 큰 문자열을 처리해야 하는 경우 Web Utility에 의존해야 합니다.UrlEncode를 사용하여 문제를 해결하거나 문제를 해결합니다.
편집: 위에서 언급한 모든 특이점을 수정하려고 시도했습니다.Url.Encode
,Url.EncodeIllegalCharacters
,그리고.Url.Decode
정적 방법이것들은 코어 패키지(작고 모든 HTTP 내용이 포함되어 있지 않음)에 들어 있거나 소스에서 자유롭게 복사할 수 있습니다.이에 대한 귀하의 의견/피드백을 환영합니다.
다른 방식으로 인코딩된 문자를 검색하는 데 사용한 코드는 다음과 같습니다.
var diffs =
from i in Enumerable.Range(0, char.MaxValue + 1)
let c = (char)i
where !char.IsHighSurrogate(c)
let diff = new {
Original = c,
UrlEncode = WebUtility.UrlEncode(c.ToString()),
EscapeDataString = Uri.EscapeDataString(c.ToString()),
}
where diff.UrlEncode != diff.EscapeDataString
select diff;
foreach (var diff in diffs)
Console.WriteLine($"{diff.Original}\t{diff.UrlEncode}\t{diff.EscapeDataString}");
이러한 방법 중 하나를 사용해서는 안 됩니다.마이크로소프트의 사이트 간 스크립팅 방지 라이브러리에는 다음에 대한 대체 기능이 포함되어 있습니다.HttpUtility.UrlEncode
그리고.HttpUtility.HtmlEncode
표준 준수 및 보안이 향상되었습니다.보스로은, 신당너▁a를 받게 됩니다.JavaScriptEncode
방법 또한.
Server.UrlEncode()는 Classic ASP와의 하위 호환성을 제공하기 위해 존재합니다.
Server.UrlEncode(str);
다음과 같음:
HttpUtility.UrlEncode(str, Response.ContentEncoding);
마찬가지로Server.UrlEncode()
출들HttpUtility.UrlEncode()
언급URL : https://stackoverflow.com/questions/602642/server-urlencode-vs-httputility-urlencode
'programing' 카테고리의 다른 글
Windows AppFabric이란 무엇입니까? (0) | 2023.05.06 |
---|---|
항상 맨 위에 있는 WPF (0) | 2023.05.06 |
기존 Xcode 프로젝트에서 Git 사용 (0) | 2023.05.06 |
데이터베이스 목록을 로드하지 못했습니다. (0) | 2023.05.06 |
iOS 상태 표시줄 높이를 프로그래밍 방식으로 가져오는 방법 (0) | 2023.05.01 |