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