HTMLスペースが%20ではなく%2520と表示される


109

ファイル名をfirefoxブラウザに渡すと、スペースがでは%2520 なくに置き換えられます%20

というファイルに次のHTMLがありますmyhtml.html

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

myhtml.htmlFirefox にロードすると、画像が壊れた画像として表示されます。リンクを右クリックして画像を表示すると、次の変更されたURLが表示されます。

file:///c:/Documents%2520and%2520Settings/screenshots/Image01.png
                    ^
                    ^-----Firefox changed my space to %2520.

一体何ですか?それは私のスペースをに変えました%2520。それを変換してはいけません%20か?

このHTMLファイルを変更して、ブラウザが私の画像を見つけられるようにするにはどうすればよいですか?何が起きてる?

回答:


219

それ%2520が何であるかについて少し説明します:

コモンスペース文字は、お気づきのようにエンコードさ%20れます。%文字は次のようにエンコードされます%25

あなたが得る方法%2520はあなたのURLがすでにそれを持っているとき%20であり、再びurlencodedされ、それがに変換さ%20%2520ます。

あなた(またはあなたが使用しているかもしれないフレームワーク)はダブルエンコーディング文字ですか?

編集: 特にLOCALリンクの場合、これを少し拡張します。リソースにリンクしたい場合C:\my path\my file.html

  • ローカルファイルパスのみを指定した場合、ブラウザーは指定されたすべての文字をエンコードして保護することが期待されます(上記で%は、有効なファイル名文字であり、エンコードされるため、上記のようにスペースを使用する必要があります)。適切なURLに(次のポイントを参照)。
  • file://プロトコルでURLを提供する場合、基本的に、すべての予防策を講じ、エンコードが必要なものをエンコードしたことを示しています。残りは特殊文字として扱う必要があります。したがって、上記の例では、を指定する必要がありますfile:///c:/my%20path/my%20file.html。スラッシュの修正は別として、クライアントはここで文字をエンコードすべきではありません。

ノート:

  • スラッシュの方向-スラッシュ/はURLで使用され\、Windowsのパスでは逆スラッシュが使用されますが、ほとんどのクライアントは適切なスラッシュに変換することで両方を処理します。
  • さらに、リモートホストではなく現在のマシンを黙って参照しているため、プロトコル名の後にスラッシュが3つあります(省略されていない完全なパスはになりますfile://localhost/c:/my%20path/my%file.html)が、ほとんどのクライアントはホスト部分がなくても機能します(つまり、2つのスラッシュのみ) )ローカルマシンを意味すると想定し、3番目のスラッシュを追加します。

1
Hexblotは実際にはここで正しいです。通常、これは、プログラミングによってURLをurlエンコードしていて、ボットが入ってきてそれを2回目にエンコードしたときに発生します。ボットはこれを行うという悪い癖があります。この問題に対処できる方法は2つあります。1)トライキャッチ例外で404または401のいずれかを使用するか、ビジネスロジックの別のメソッドに渡す前に、二重にデコードされた値をデコードする小さな関数を記述できます。
ライアンワッツ

これは、jQueryのajaxリクエストを送信するときになぜ取得されたのかを理解するのに役立ちました。値にencodeURIComponent関数を使用してajax GETリクエストでデータ属性を設定していましたが、jQueryはデフォルトですでにそれを行っているため、なぜ%2520を取得していましたか?本当にありがとう。
Asher

リンクを解釈するかしないかを伝えるためのchromeのコマンドライン引数はありませんか?
AleX_ 2017年

私はhttp://mysite/test & that... If I use UrlEncode`を変更してhttp://mysite/test%20&%20thatいますが、&%26にも変更したいので、mysite / test%20%26%20です `どのようにすればよいですか?
Si8 2017

10

いくつかの理由-おそらく有効-の理由で、URLは2回エンコードされました。%25urlencoded %サインです。したがって、元のURLは次のようになりました。

http://server.com/my path/

次に、それは一度urlencodeされました:

http://server.com/my%20path/

そして2回:

http://server.com/my%2520path/

したがって、他のコンポーネントがすでにあなたのためにそれをしているように見えるので、あなたはあなたのケースでは-urlencodingをしないでください。単にスペースを使用する


同じ問題が発生しましたが、デフォルトのurlencodingが最初に2回処理された理由がわかりません。
ジョンウォンジン2017

状況によっては、エンコーディングを正しく使用すると、ダブルエンコーディングが完全に有効な結果になる場合があります。この答えは、ダブルエンコーディングが常に間違っているという印象を与える可能性があり、「動作させる」ために必要な数のエンコード/エンコード解除の呼び出しを追加するだけで、エンコードの問題を修正できるという印象を与える可能性があります。これは誤りであり、これがエンコーディングのバグが最初に発生する方法です。-1
フロリアン冬

@FlorianWinter私はあなたが行の間でこれをどこで読んだか本当にわかりません。あなたは私を助けることができます?(質問と私の回答を読んでください)
hek2mgl 2018

7

firefoxブラウザーを介してローカルファイル名にアクセスする場合、file:\\\プロトコル(http://en.wikipedia.org/wiki/File_URI_scheme)を強制する必要があります。そうしないと、Firefoxがスペースを2回エンコードします。これからhtmlスニペットを変更します。

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

これに:

<img src="file:\\\C:\Documents and Settings\screenshots\Image01.png"/>

またはこれ:

<img src="file://C:\Documents and Settings\screenshots\Image01.png"/>

次に、firefoxはこれがローカルファイル名であることを通知され、ブラウザで画像を正しくレンダリングし、文字列を1回正しくエンコードします。

役立つリンク:http : //support.mozilla.org/en-US/questions/900466


0

次のコードスニペットで問題が解決しました。これは他の人に役立つかもしれないと思った。

var strEnc = this.$.txtSearch.value.replace(/\s/g, "-");
strEnc = strEnc.replace(/-/g, " ");

デフォルトでencodeURIComponentはなく、コードの最初の行spaceshyphens使用してすべてを正規表現パターンに変換し/\s\g、次の行はその逆、つまりすべてを別のhyphensspaces使用するように変換しますregex pattern /-/g。ここ/gで実際にfinding all文字を照合します。

この値をAjax呼び出しに送信すると、それは、normal spacesまたは単純にトラバースして%20、を取り除きdouble-encodingます。


1
私はあなたが問題を解決せずにカバーするだけであると思います-根本原因はまだどこかにあり、あなたは二重の作業をしています(どこかで誤って2回エンコードしていて、どこかでカバーするために手動でデコードしていますそれまで)。あなたが物事を「適切に」したいと仮定すると、最善のことはデバッグして本当の犯人を見つけることでしょう。
Nick Andriopoulos 16年

実際、この問題が発生した場所ならどこでもソリューションが機能しました。なので投稿しました。
Subrata Sarkar

2
@NiladriSarkar hexboltが言っていたのは、コードが機能している間は、実行可能な解決策ではなく、汚い修正であり、避けなければならないということです
2Dee

-1

これを試して?

encodeURIComponent('space word').replace(/%20/g,'+')


1
StackOverflowへようこそ!一般的に、答えは、コードスニペットではなく、提案がOPの問題を解決する理由についての説明が含まれている場合に役立ちます。また、この質問にはすでに受け入れられた回答があるので、なぜあなたの回答がその回答よりも正しいのかについての説明を追加することをお勧めします。
DaveyDaveDave 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.