Пространство 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,'+')