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


224

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

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

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

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

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



4
PHP에서 urldecode는 % 2b (encoded +)를 공백으로 디코딩합니다. 이 사용을 피하려면 rawurldecode. 나는 이것이 "php url decode breaks plus plus"에 대한 구글 검색에서 높은 평가 결과이기 때문에 참고로 여기에 말한다.
danielson317

답변:


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

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


12
+1 불행히도, 많은 "URL 코더 / 인코더"가 실제로 이해되지 않습니다. 예 : sislands.com/coin70/week6/encoder.htm keyone.co.uk/tools-url-encoder.asp meyerweb.com/eric/tools/dencoder
leonbloy

11
@ 스토 보 : 인용이 필요했습니다.
bukzor

8
@Stobor RFC에서 +문자가 쿼리 구성 요소의 공백으로 해석 되었다고 말한 적이 있습니까? 아니면 단순히 "야생에서"규칙입니까?
Pacerier

44
@Pacerier 및 @bukzor : RFC 1738 (2396 및 3986에 의해 수정 됨)은 체계 ( http:), 권한 ( //server.example.com) 및 경로 ( /myfile/mypage.htm) 구성 요소를 정의하며 +캐릭터에 대한 특별한 의미는 정의하지 않습니다 . HTML 스펙은 조회 구성 요소를 " RFC1738에서 와 같이 공백 및 기타 특수 문자로 대체"로 정의되는 MIME 유형 application / x-www-form-urlencoded 로 정의 +합니다. 따라서 그것은 "야생에서"가 아니라 허용되는 (RFC가 아닌) 표준에서 온 것입니다.
Stobor

2
.NET 메소드 Server.UrlEncode는 경로 부분에 공백을 잘못 표시하여 HTTP 규칙을 위반하여 잘못 인코딩합니다.
Suncat2000

243

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

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

18
리터럴 '+'문자가 URL 의 경로 구성 요소에 나타나는 것이 합법적입니다 .
Sam Stainsby

4
백엔드 (또는 적어도 PHP)가 리터럴 +를 받으려면 트리플 인코딩해야합니다.%25252B
Umbrella

11
이 답변은 질문과는 전혀 관련이 없습니다.
Nisse Engström

22

공백 문자는 한 컨텍스트 (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;

0

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'

1
이것은 문제를 다루지 않습니다. 또한 특정 언어 (JavaScript)로 URL을 잘못 인코딩합니다. 상황에 따라 URL이 작동하기 위해 특수한 (리터럴이 아닌) 슬래시 (/) 및 콜론 (:)이 필요한 위치를 인코딩하지 않을 수도 있습니다. .
Gremio

정말 도움이되었습니다!
qwsd

-2

아래에서 시도하십시오 :

<script type="text/javascript">

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

2
두 사람이이 답변에 투표 한 것이 매우 이상합니다. 말 그대로 질문과 관련이 없습니다.
Andrew Barber

1
다른 문자는 어떻습니까 * @-_ +. /
Ravi

1
@AndrewBarber 왜 관련이 없습니까? +는 % 2B가 됨
자바 가이

이것은 여러 가지 이유로 잘못되었습니다 ... escape더 이상 사용되지 않으므로 대신 encodeURIpart의 쿼리 를 사용해야합니다 encodeURIComponent. 또한 매개 변수 문자열은 w3c 에 따라 인코딩해야합니다 .
Christoph

-5

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

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

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

8
나는 그것이 옳지 않다. RFC2396 ( , tf.org/rfc/rfc2396.txt ) 에 따르면 덧셈 은 URI의 경로 (세그먼트)에 예약 된 문자가 아니라 쿼리 구성 요소입니다. 그것은 URL 인코딩 될 필요가 없으므로 경로에서만 공백으로 해석되어서는 안된다는 것을 암시하는 것처럼 보입니다.
tlrobinson 2016 년

3
그러나 rfc 1738은 플러스를 공백으로 취급합니다. 인코딩 / 디코딩 기능으로 구현되는 기능에 따라 다릅니다. 를 urlencode는 RFC 2396 다음 반면 예를 들어, PHP에서, rawurlencode은 RFC 1738을 다음과
조나단 Fingland

1
자, 이제 좀 더 혼란스러워합니다. 위의 예에서 a.com % 2Fa % 2Bb는 내가 원하는 것이 아니며 최소한 a.com/a%2Bb 일 것입니다. 이것은 내가 다루고있는 실제 URL이며 쿼리 문자열에서 매개 변수로 전달되는 URL이 아닙니다. 명확하게 설명하는 데 도움이 될만한 배경 지식을 얻기 위해 Mac OS X Finder에서 파일 시스템 URL을 반환합니다. 따라서 "a? + b.txt"라는 파일이 있으면 "file : //a%3F%2B.txt"가 아니라 "file : //a%3F+b.txt"와 같은 것을 반환합니다. . 파인더가 잘못되었거나 쿼리 문자열 앞에 +가 실제로 플러스입니까?
Francisco Ryan Tolmasky I

2
Jonathan : 1738은 +가 예약되어 있다고 확신합니까? 알겠습니다 : safe = "$"| "-"| "_"| "." | "+"예약되지 않음 = 알파 | 자리 | 안전 | 따라서 : 영숫자, 특수 문자 "$ -_. +! * '()"및 예약 된 목적으로 사용되는 예약 문자 만 URL 내에서 인코딩되지 않은 상태로 사용될 수 있습니다.
tlrobinson 2016 년

2
"항상 탈출해야한다"는 더 많은 자격이 필요하며, 그 대답은 어쨌든 그 질문과 관련이 없습니다.
bug
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.