Пространство html отображается как% 2520 вместо %20

Передача имени файла в браузер Firefox приводит к замене пробелов на %2520 вместо %20.

У меня есть следующий HTML в файле с именем myhtml.html:

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

Когда я загружаю myhtml.html в firefox, изображение отображается как сломанное изображение. Поэтому я прямо щелкаю по ссылке, чтобы просмотреть изображение, и он показывает этот измененный URL:

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

Что, черт возьми? Он превратил мое пространство в %2520. Не следует ли преобразовать его в %20?

Как мне изменить этот HTML файл, чтобы браузер мог найти мое изображение? Что здесь происходит?

Ответ 1

Немного объясняет, что это за %2520:

Общий символ пробела кодируется как %20, как вы отметили сами. Символ % кодируется как %25.

То, как вы получаете %2520, - это когда ваш url уже имеет %20 в нем и снова получает urlencoded, который преобразует %20 в %2520.

Являетесь ли вы (или любой каркас, который вы используете) двойными символами кодирования?

Edit: Расширяя это немного, особенно для ЛОКАЛЬНЫХ ссылок. Предполагая, что вы хотите ссылаться на ресурс C:\my path\my file.html:

  • Если вы указали только путь к локальному файлу, ожидается, что браузер будет кодировать и защищать все указанные символы (в приведенном выше примере вы должны указывать пробелы, как показано, так как % является допустимым символом имени файла и, как таковой, будут закодированы) при преобразовании в правильный URL-адрес (см. следующую точку).
  • если вы указываете URL-адрес с протоколом file://, вы в основном заявляете, что принимаете все меры предосторожности и кодируете кодировку, а остальные должны рассматриваться как специальные символы. В приведенном выше примере вы должны предоставить file:///c:/my%20path/my%20file.html. Помимо фиксации косой черты, клиенты не должны кодировать символы здесь.

ПРИМЕЧАНИЯ:

  • Направление косой черты - косые черты / используются в URL-адресах, обратные косые черты \ в путях Windows, но большинство клиентов будут работать с ними путем преобразования их в правильную косую черту.
  • Кроме имени протокола, есть три слэша, так как вы молча ссылаетесь на текущий компьютер вместо удаленного хоста (полный неразрешенный путь будет file://localhost/c:/my%20path/my%file.html), но снова большинство клиентов будут работать без хоста (т.е. только две слэши), предположив, что вы имеете в виду локальную машину и добавляете третью косую черту.

Ответ 2

По какой-то (возможно, действительной) причине URL был закодирован дважды. %25 - это кодированный в % знак %. Таким образом, оригинальный URL выглядел так:

http://server.com/my path/

Затем он был один раз закодирован:

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

и дважды:

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

Таким образом, вы не должны делать урлен-кодирование - в вашем случае - так как другие компоненты, кажется, уже для вас. Используйте просто пробел

Ответ 3

Когда вы пытаетесь посетить локальное имя файла через браузер Firefox, вам необходимо принудительно выполнить протокол file:\\\ (http://en.wikipedia.org/wiki/File_URI_scheme) или иначе firefox будет кодировать ваше пространство TWICE. Измените 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 уведомляется о том, что это локальное имя файла, и он правильно отображает изображение в браузере, правильно кодируя строку один раз.

Полезная ссылка: http://support.mozilla.org/en-US/questions/900466

Ответ 4

Следующий фрагмент кода разрешил мою проблему. Думал, что это может быть полезно для других.

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

Ответ 5

Попробуй это?

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