web-dev-qa-db-ja.com

URLとプラス記号

URLのクエリ文字列内の+はスペースを表すことを認識しています。これもクエリ文字列領域外の場合ですか?つまり、次のURLを実行します。

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

実際に表す:

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

(したがって、実際に+である必要がある場合はエンコードする必要があります)、または実際に実際にa+b/cを表しますか?

  • URLのパスセクションのパーセントエンコーディングはデコードされると予想されますが、
  • パスコンポーネント内の+文字は、文字通り処理されることが期待されています。

明示的に:+は、クエリコンポーネントの特殊文字にすぎません。

162
Stobor

W3Schools に、対応するURLエンコード文字のニースリストがあります。

  • +%2Bになります
  • スペースは%20になります
212
Niels R.

スペース文字は、1つのコンテキスト(application/x-www-form-urlencodedのキーと値のペア)でのみ「+」としてエンコードできます。

RFC-1866(HTML 2.0仕様)、パラグラフ8.2.1。サブパラグラフ1.は次のように述べています。「フォームのフィールド名と値はエスケープされます。スペース文字は「+」に置き換えられ、予約文字はエスケープされます」)。

RFC-1866でスペースをプラスとしてエンコードできるURLの文字列の例を次に示します: " http://example.com/over/there?name=foo+bar "。そのため、「?」の後のみ、スペースをプラスに置き換えることができます(他の場合、スペースは%20にエンコードする必要があります)。フォームデータをエンコードするこの方法は、後のHTML仕様でも提供されています。たとえば、HTML 4.01仕様でapplication/x-www-form-urlencodedに関連する段落を探すなどです。

ただし、コンテキストを常に正しく判断するのは難しいため、スペースを「+」としてエンコードしないことをお勧めします。 RFC-3986、p.2.3で定義されている「未予約」を除くすべての文字をパーセントエンコードすることをお勧めします。エンコードする必要があるものを示すコード例を次に示します。これはDelphi(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;
19
Maxim Masiutin

encodeURIComponent関数を使用してURLを修正します。ブラウザおよびnode.jsで機能します

res.redirect("/signin?email="+encodeURIComponent("[email protected]"));


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