[url] URL 체계 / 호스트 / 경로의`+`는 공백을 나타 냅니까?

나는 것을 알고 +에 URL의 쿼리 문자열에서 공백을 나타냅니다. 쿼리 문자열 영역 외부에서도 마찬가지입니까? 즉, 다음 URL을 수행합니다.

http://a.com/a+b/c

실제로 다음을 나타냅니다.

http://a.com/a b/c

(따라서 실제로이어야하는 경우 인코딩해야합니다 +) 또는 실제로 실제로 표시 a+b/c합니까?



답변

  • URL의 경로 섹션에서 인코딩 백분율이 디코딩 될 것으로 예상되지만
  • +경로 구성 요소의 모든 문자는 그대로 처리됩니다.

명시 적으로 : +쿼리 구성 요소의 특수 문자입니다.


답변

W3Schools 에서 해당 URL 인코딩 문자의 멋진 목록을 찾을 수 있습니다 .

  • + 된다 %2B
  • 공간이된다 %20

답변

공백 문자는 한 컨텍스트 (application / x-www-form-urlencoded 키-값 쌍)에서만 “+”로 인코딩 될 수 있습니다.

RFC-1866 (HTML 2.0 사양), 단락 8.2.1. 하위 단락 1 : “양식 필드 이름과 값은 이스케이프됩니다 : 공백 문자는`+ ‘로 대체되고 예약 문자는 이스케이프됩니다”).

다음은 RFC-1866에서 ” http://example.com/over/there?name=foo+bar ” 와 같이 인코딩 공백을 허용하는 URL의 문자열 예입니다 . 따라서 “?”뒤에 만 공백을 플러스로 바꿀 수 있습니다 (다른 경우 공백은 % 20으로 인코딩해야 함). 이러한 형식의 데이터 인코딩 방식은 이후의 HTML 사양에서도 제공됩니다. 예를 들어 HTML 4.01 사양에서 application / x-www-form-urlencoded 등에 대한 관련 단락을 찾으십시오.

그러나 컨텍스트를 항상 올바르게 결정하기는 어렵 기 때문에 공백을 “+”로 인코딩하지 않는 것이 가장 좋습니다. RFC-3986, p.2.3에 정의 된 “예약되지 않은”을 제외한 모든 문자를 백분율로 인코딩하는 것이 좋습니다. 다음은 인코딩해야 할 것을 보여주는 코드 예제입니다. 델파이 (pascal) 프로그래밍 언어로 제공되지만 소유 한 언어에 관계없이 모든 프로그래머가 어떻게 작동하는지 이해하기가 매우 쉽습니다.

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *)
function UrlEncodeRfcA(const S: AnsiString): AnsiString;
const
  HexCharArrA: array [0..15] of AnsiChar = '0123456789ABCDEF';
var
  I: Integer;
  c: AnsiChar;
begin
 // percent-encoding, see RFC-3986, p. 2.1
  Result := S;
  for I := Length(S) downto 1 do
  begin
    c := S[I];
    case c of
      'A' .. 'Z', 'a' .. 'z', // alpha
      '0' .. '9',             // digit
      '-', '.', '_', '~':;    // rest of unreserved characters as defined in the RFC-3986, p.2.3
      else
        begin
          Result[I] := '%';
          Insert('00', Result, I + 1);
          Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)];
          Result[I + 2] := HexCharArrA[Byte(C) and $F];
        end;
    end;
  end;
end;

function UrlEncodeRfcW(const S: UnicodeString): AnsiString;
begin
  Result := UrlEncodeRfcA(Utf8Encode(S));
end;


답변

encodeURIComponent 함수를 사용하여 URL을 수정하십시오. 브라우저 및 node.js에서 작동합니다.

res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com"));


> encodeURIComponent("http://a.com/a+b/c")
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc'


답변

아래에서 시도하십시오 :

<script type="text/javascript">

function resetPassword() {
   url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
}
function fixEscape(str)
{
    return escape(str).replace( "+", "%2B" );
}
</script>


답변

항상 URL을 인코딩해야합니다.

Ruby가 URL을 인코딩하는 방법은 다음과 같습니다.

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"


답변