質問
URLのクエリ文字列の +
はスペースを表していることを認識しています。これもクエリ文字列領域外の場合ですか?つまり、次のURLを実行します。
http://a.com/a+b/c
実際には:
http://a.com/a b/c
(したがって、実際に +
である必要がある場合はエンコードする必要があります)、または実際に a + b / c
を表しますか?
解決
- URLのパスセクションのエンコードのパーセントはデコードされると予想されますが、 パスコンポーネント内の
-
+
文字は、文字どおりに処理されることが期待されています。
明示的に: +
はクエリコンポーネントの特殊文字にすぎません。
他のヒント
W3Schools で、対応するURLエンコード文字の素晴らしいリストを見つけることができます。
-
+
は%2B
になります
- スペースは
%20
になります
スペース文字は、「+」としてのみエンコードできます。 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;
encodeURIComponent関数を使用してURLを修正します。これはBrowserと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"