server.urlencode vs. httputility.urlencode
문제
server.urlencode와 httputility.urlencode 사이에 차이가 있습니까?
해결책
HttpServerUtility.UrlEncode
사용합니다 HttpUtility.UrlEncode
내부적. 구체적인 차이는 없습니다. 존재의 이유 Server.UrlEncode
클래식 ASP와의 호환성입니다.
다른 팁
나는 전에이 방법들에 대해 상당한 두통이 있었는데 나는 당신을 추천합니다 피하다 모든 변형 UrlEncode
, 대신 사용하십시오 Uri.EscapeDataString
- 적어도 그 사람은 이해할 수있는 행동을 가지고 있습니다.
보자 ...
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
그러나 내가 개인적으로 가장 좋아하는 것은 있어야합니다 httputility.urlpathencode - 이것은 정말로 이해할 수 없습니다. 인코딩 :
- " " ==> "%20"
- "100%true"==> "100 %% 20true"(OK, URL이 이제 깨졌습니다)
- "테스트 A.aspx#앵커 B"==> "테스트%20a.aspx#앵커%20B"
- "테스트 A.aspx? hmm#앵커 B"==> "테스트%20a.aspx? hmm#anchor b" (이전 탈출 시퀀스와의 차이에 주목하십시오!)
또한 Lovely 특정 MSDN 문서는 "웹 서버에서 클라이언트로 신뢰할 수있는 HTTP 전송을 위해 URL 문자열의 경로 부분을 인코딩합니다." - 실제로 그것이 무엇을하는지 설명하지 않고. 당신은 우지와 함께 발에 자신을 쏘지 않을 가능성이 적습니다 ...
요컨대, 고집하십시오 uri.escapedatastring.
이번이 처음으로 요청 된 지 거의 9 년이 지났으며 .NET Core 및 .NET Standard의 세계에서 URL 인코딩을위한 가장 일반적인 옵션은 다음과 같습니다. webutility.urlencode (아래에 System.Net
) 그리고 uri.escapedatastring. 여기와 다른 곳에서 가장 인기있는 대답으로 판단하면 uri.escapedatastring 바람직한 것 같습니다. 하지만 그것은? 차이점을 이해하기 위해 몇 가지 분석을했으며 다음과 같이 생각해 냈습니다.
WebUtility.UrlEncode
공간을 인코딩합니다+
;Uri.EscapeDataString
그것을 인코딩합니다%20
.Uri.EscapeDataString
백분율 인코딩!
,(
,)
, 그리고*
;WebUtility.UrlEncode
하지 않습니다.WebUtility.UrlEncode
백분율 인코딩~
;Uri.EscapeDataString
하지 않습니다.Uri.EscapeDataString
던지는 aUriFormatException
65,520 자 이상의 문자열에서;WebUtility.UrlEncode
하지 않습니다. (특히 URL 인코딩 된 양식 데이터를 처리 할 때 생각하는 것보다 더 일반적인 문제.)Uri.EscapeDataString
던지는 aUriFormatException
에 높은 대리 캐릭터;WebUtility.UrlEncode
하지 않습니다. (이것은 UTF-16 일 것입니다. 아마 훨씬 덜 일반적입니다.)
URL 인코딩 목적으로 문자는 3 가지 범주 중 하나에 맞습니다. 예약 (합법적이지만 특별한 의미가 있습니다. ~할 것 같다 인코딩하고 싶다); 그리고 다른 모든 것은 (항상 인코딩되어야합니다).
에 따르면 RFC, 예약 된 문자는 다음과 같습니다. :/?#[]@!$&'()*+,;=
그리고 예방되지 않은 캐릭터는 영숫자이며 -._~
판결
uri.escapedatastring 임무를 명확하게 정의합니다. %-모든 예약 및 불법적 인물. webutility.urlencode 정의와 구현 모두에서 더 모호합니다. 이상하게도, 그것은 일부 예약 된 문자를 인코딩하지만 다른 문자는 아니지만 (왜 괄호가 아닌 괄호가 아닌가?) ~
캐릭터.
그러므로 나는 대중적인 조언에 동의합니다 - 사용 uri.escapedatastring 가능하면 예약 된 캐릭터를 이해하십시오 /
그리고 ?
인코딩됩니다. 잠재적으로 큰 문자열, 특히 URL 인코딩 된 양식 컨텐츠를 처리 해야하는 경우 다시 시작해야합니다. webutility.urlencode 그리고 그 기발한 것을 받아들이거나, 그렇지 않으면 문제를 해결하십시오.
편집하다: 나는 시도했다 위에서 언급 한 모든 단점을 바로 잡기 위해 flurl TH를 통해 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
이는 더 많은 표준을 준수하고 더 안전합니다. 보너스로, 당신은 얻을 수 있습니다 JavaScriptEncode
방법도.
server.urlencode ()는 클래식 ASP와의 역 호환성을 제공하기 위해 있습니다.
Server.UrlEncode(str);
다음과 같습니다.
HttpUtility.UrlEncode(str, Response.ContentEncoding);
똑같다, Server.UrlEncode()
전화 HttpUtility.UrlEncode()