Пространство html отображается как %2520 вместо %20
передача имени файла в браузер firefox приводит к замене пробелов на %2520 вместо %20.
у меня есть следующий HTML в файле под названием myhtml.html:
<img src="C:Documents and SettingsscreenshotsImage01.png"/>
когда я загружаю myhtml.html в firefox изображение отображается как сломанное изображение. Поэтому я щелкните правой кнопкой мыши ссылку для просмотра изображения, и он показывает этот измененный URL:
file:///c:/Documents%2520and%2520Settings/screenshots/Image01.png
^
^-----Firefox changed my space to %2520.
Какого черта? Он превратил мое пространство в %2520. Разве он не должен преобразовывать его в %20?
как изменить этот HTML-файл, чтобы браузер мог найти мое изображение? Что здесь происходит?
5 ответов:
немного объясняя, что это
%2520- Это :символ общего пространства кодируется как
%20Как вы сами отметили. Элемент%символ кодируется как%25.вы
%2520Это когда Ваш url уже имеет%20в нем, и получает urlencoded снова, который преобразует%20to%2520.вы (или любой фреймворк, который вы можете использовать) двойная кодировка персонажи?
Edit: Расширяясь немного на этом, особенно для местные ссылки. Предполагая, что вы хотите связать с ресурсом
C:\my path\my file.html:
- если вы предоставляете только локальный путь к файлу, браузер должен кодировать и защищать все заданные символы (в приведенном выше, вы должны дать его с пробелами, как показано, так как
%является допустимым символом имени файла и поэтому он будет закодирован) при преобразовании в правильный URL (см. Далее точка.)- если вы предоставляете URL-адрес с
file://протокол, вы в основном заявляете, что вы приняли все меры предосторожности и закодировали то, что нуждается в кодировке, остальные должны рассматриваться как специальные символы. В приведенном выше примере вы должны таким образом предоставитьfile:///c:/my%20path/my%20file.html. Помимо исправления косых черт, клиенты не должны кодировать символы здесь.Примечания:
- Слэш направление-вперед косые черты
/используются в URL, обратные косые черты\в путях Windows, но большинство клиентов будут работать с обоими, преобразуя их в надлежащую косую черту.- кроме того, есть 3 косые черты после имени протокола, так как вы молча ссылаетесь на текущую машину вместо удаленного хоста ( полный unabbreviated путь будет
file://localhost/c:/my%20path/my%file.html), но опять же большинство клиентов будут работать без хост-части (т. е. только две косые черты), предполагая, что вы имеете в виду локальную машину и добавляя третью косую черту.
по какой-то причине url был закодирован дважды.
%25- это urlencoded виде%знак. Таким образом, исходный url-адрес выглядел так:http://server.com/my path/затем он получил urlencoded один раз:
http://server.com/my%20path/дважды:
http://server.com/my%2520path/так что вы не должны делать urlencoding, как другие компоненты, кажется, что уже для вас. Используйте просто пробел
когда вы пытаетесь посетить локальное имя файла через браузер firefox, вы должны заставить
file:\\протокол (http://en.wikipedia.org/wiki/File_URI_scheme) или же firefox будет кодировать ваше пространство дважды. Измените фрагмент 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
следующий фрагмент кода решил мою проблему. Думал, что это может быть полезно для других.
var strEnc = this.$.txtSearch.value.replace(/\s/g, "-"); strEnc = strEnc.replace(/-/g, " ");вместо использования по умолчанию
encodeURIComponentмоя первая строка кода преобразует всеspacesнаhyphensС помощью regex шаблон/\s\gи следующая строка как раз делает обратное, т. е. преобразует всеhyphensнаspacesчерез другойregex pattern /-/g. Здесь/gна самом деле отвечает заfinding allсоответствующие символы.когда я отправив это значение в мой вызов Ajax, он проходит как
normal spacesили просто%20и таким образом избавляется отdouble-encoding.
Comments