Простір у форматі html відображається як% 2520 замість% 20


109

Передача імені файлу до браузера 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-файл, щоб браузер міг знайти моє зображення? Що тут відбувається?

Відповіді:


219

Трохи пояснення, що це %2520таке:

Символ загального простору кодується так, %20як ви самі зазначили. %Символ кодується , як %25.

У такий спосіб ви отримуєте %2520, коли ваш URL вже є %20, і він знову отримує кодування urlen, що перетворює %20на %2520.

Ви (або будь-яка рамка, яку ви використовуєте) подвійним кодуванням символів?

Редагувати: трохи розширюючи це питання, особливо для місцевих посилань. Припустимо, що ви хочете зв’язатися з ресурсом C:\my path\my file.html:

  • якщо ви надаєте лише локальний шлях до файлу, очікується, що браузер кодує та захищає всі задані символи (у наведеному вище ви повинні надати пробіли, як показано, оскільки %це дійсний символ імені файлу і як такий він буде закодований) при перетворенні до належної URL-адреси (див. наступний пункт).
  • якщо ви надаєте URL-адресу з file://протоколом, ви в основному заявляєте, що ви вжили всіх запобіжних заходів і кодували те, що потрібно кодувати, решту слід розглядати як спеціальні символи. У наведеному вище прикладі ви повинні надати file:///c:/my%20path/my%20file.html. Крім фіксації косої риски, клієнти не повинні кодувати символи тут.

ПРИМІТКИ:

  • Напрямок косої риски - косою косою рискою вперед /використовується в URL-адресах, косою \косою рисою в контурах Windows, але більшість клієнтів працюватимуть з обома, перетворюючи їх у відповідну косую косу рису.
  • Крім того, є 3 косої риски після назви протоколу, оскільки ви мовчки посилаєтесь на поточну машину замість віддаленого хоста (це був би повний необмежений шлях file://localhost/c:/my%20path/my%file.html), але знову ж таки більшість клієнтів працюватимуть без хост-частини (тобто лише два косої риски) ) припускаючи, що ви маєте на увазі локальну машину та додавши третю косу рису.

1
Тут насправді правильний Hexblot. Зазвичай це трапляється, коли ти переспівуєш URL-адреси програмуванням, а бот приходить і кодує його вдруге. Боти мають погану звичку робити це. Ви можете впоратися з цим питанням два. 1) Ви можете або 404, або 401, за винятком try catch, або ви можете написати невелику функцію, яка буде декодувати подвійні декодовані значення, перш ніж передати їх іншому методу для бізнес-логіки.
Райан Уоттс

Це допомогло мені зрозуміти, чому я отримую це під час надсилання запиту на jQuery ajax. Я встановлював атрибут даних у запиті ajax GET з функцією encodeURIComponent за значенням, але jQuery вже робить це за замовчуванням, отже, чому я отримував% 2520. Дуже корисно дякую.
Ашер

Чи немає аргументу командного рядка для chrome, щоб сказати, що він інтерпретує або не інтерпретує посилання?
AleX_

У мене є http://mysite/test & that... If I use UrlEncode`, на який він змінюється, http://mysite/test%20&%20thatале я також хочу &змінити його на% 26, щоб це було mysite / test% 20% 26% 20, що `Як це зробити?
Si8

10

З деяких - можливо, дійсних - причин URL кодувались двічі. %25є %знаком, який кодується урленом . Так оригінальний URL виглядав так:

http://server.com/my path/

Тоді він отримав urlencoded один раз:

http://server.com/my%20path/

і двічі:

http://server.com/my%2520path/

Таким чином, ви не повинні робити кодування urlencoding - у вашому випадку - так, як інші компоненти здаються цим вже для вас. Використовуйте просто пробіл


У мене виникла така ж проблема, але я не розумію, чому вперше обробку urlencoding було оброблено двічі.
jungwon jin

Залежно від ситуації подвійне кодування може бути цілком достовірним результатом правильного використання кодування. Ця відповідь може створити враження, що подвійне кодування завжди неправильне, і що ви можете просто виправити проблеми з кодуванням, додавши стільки викликів кодування / скасування кодування, скільки потрібно, щоб "змусити його працювати". Це неправильно, і саме тому кодування помилок стає на першому місці. -1
Флоріан Зима

@FlorianWinter Я насправді не бачу, де ти читаєш це між рядків. Ви можете мені допомогти? (Прочитайте, будь ласка, питання та мою відповідь)
hek2mgl

7

Коли ви намагаєтесь відвідати локальне ім'я файлу через браузер 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


0

Наступний фрагмент коду вирішив мою проблему. Думав, що це може бути корисним для інших.

var strEnc = this.$.txtSearch.value.replace(/\s/g, "-");
strEnc = strEnc.replace(/-/g, " ");

Замість використання за замовчуванням encodeURIComponentмій перший рядок коду перетворює все spacesна hyphensвикористання шаблону регулярних виразів, /\s\gа наступний рядок просто робить зворотний, тобто перетворює все hyphensназад, spacesвикористовуючи інший regex pattern /-/g. Ось /gнасправді відповідальність заfinding all відповідність символів.

Коли я надсилаю це значення на свій дзвінок у Ajax, воно переходить як normal spacesпросто, %20і таким чином позбавляється double-encoding.


1
Я припускаю, що ви не вирішуєте питання, а просто прикриваєте його - першопричиною це все ще є десь там, і ви робите подвійну роботу (десь ви випадково кодуєте двічі, а десь ви декодуєте вручну, щоб приховати це вгору). Припускаючи, що ви хочете робити справи «належним чином», найкраще було б налагодити помилку та знайти справжнього винуватця.
Нік Андріопулос

Насправді рішення працювало для мене, де б я не отримав це питання. Так я розмістив.
Субрата Саркар

2
@NiladriSarkar, що намагався сказати Hexbolt, це те, що ваш код працює, але це не життєздатне рішення, а брудне виправлення, і його слід уникати ...
2Dee

-1

Спробуйте це?

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


1
Ласкаво просимо до StackOverflow! Як правило, відповіді корисніші, якщо вони містять пояснення, чому ваша пропозиція вирішить проблему ОП, а не просто фрагмент коду. Крім того, оскільки це питання вже має прийняту відповідь, було б непогано додати пояснення, чому ваша відповідь правильніша, ніж відповідь.
DaveyDaveDave
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.