Пространство 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
Как вы сами отметили.
The %
символ кодируется как %25
.
вы %2520
- Это когда Ваш url-адрес уже имеет %20
в нем, и снова urlencoded, который преобразует %20
to %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
. Вот!--8--> фактически отвечает за finding all
соответствующие символы.
когда я отправляя это значение в мой вызов Ajax, он проходит как normal spaces
или просто %20
и таким образом избавляется от double-encoding
.