Пространство 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.


попробовать?

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