문제

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 던지는 a UriFormatException 65,520 자 이상의 문자열에서; WebUtility.UrlEncode 하지 않습니다. (특히 URL 인코딩 된 양식 데이터를 처리 할 때 생각하는 것보다 더 일반적인 문제.)
  • Uri.EscapeDataString 던지는 a UriFormatException높은 대리 캐릭터; 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()

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top