Пространство 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-файл, чтобы браузер мог найти мое изображение? Что здесь происходит?

736   5  

5 ответов:

немного объясняя, что это %2520 - Это :

символ общего пространства кодируется как %20 Как вы сами отметили. Элемент % символ кодируется как %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. Здесь /g на самом деле отвечает за finding all соответствующие символы.

когда я отправив это значение в мой вызов Ajax, он проходит как normal spaces или просто %20 и таким образом избавляется от double-encoding.

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

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

Comments

    Ничего не найдено.