5

Say I have a simple form like this:

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
    <div id="search">
      <form method="GET" action="/super-action">
        <input type="text" name="q" />
      </form>
    </div>
  </body>
</html>

with an input like: @tags "Cinéma Whatever"

a form GET request results in a url that looks like: /super-action?q=%40tags+"Cinéma+Whatever"

Now I want to reproduce that with javascript in location.hash, with a pound sign instead of a slash, like: /super-action#q=%40tags+"Cinéma+Whatever"

But with the available functions, I get there results:

  • escape(input): @tags%20%22Cin%E9ma%20Whatever%22
  • encodeURI(input): @tags%20%22Cin%C3%A9ma%20Whatever%22
  • encodeURIComponent(input): %40tags%20%22Cin%C3%A9ma%20Whatever%22
  • $(form).serialize(), without q=: %40tags+%22Cin%C3%A9ma+Whatever%22

The question: How can I make an input value, like @tags "Cinéma Whatever", look like what a form GET request would do: %40tags+"Cinéma+Whatever" using javascript?

4

1 に答える 1

4

RFC 1738によると/super-action?q=%40tags+"Cinéma+Whatever"、URL内では無効です。

したがって、英数字、特殊文字 "$-_。+!*'()、"、およびそれらの予約目的で使用される予約文字のみを、URL内でエンコードせずに使用できます。

つまり、その部分文字列を含む有効なURLを作成することはできません。特殊文字とをエンコードする必要があります。そうしないと、結果の文字列はURLではありません。"é

これが有効であると考える理由は、ブラウザがあなたをだましているためかもしれません。アドレスバーで読みやすくするために、部分的にエンコードされた形式でURLを表示している可能性があります。Wiresharkなどのプロトコルアナライザを使用して、ネットワークを介して送信される実際のURLパスを調べてみてください。

更新:これをすぐに確認しました。フォームの送信に応じて送信されるHTTPヘッダーは次のとおりです。

GET /?q=%40tags+%22Cin%C3%A9ma+Whatever%22 HTTP/1.1

したがって、最初にUTF-8エンコードされ、次にURLエンコードされます。

于 2012-05-14T15:52:00.497 に答える