Інструменти розробника · URL енкодер & декодер
втеча() vs encodeURIComponent: як JavaScriptр URL кодування еволюція
· Підземелля
Опубліковано ToolAcre · Редакція журналу
Завантажити плагін виворітна обробка історія

JavaScript має три покоління URL-encoding функції, а найстаріші ще мастила в коді виробництва. Це повідомлення пояснює, що втечу() невірно, чому ES3 додано URI функції і чому вони зберігають ! * ' ( ).
Про нас %u20AC в журналі спадщини — нездатний відбитк пальця втечу () і відмова від декодування викликає
Про нас JavaScript файл містить URL-encoding виклик за допомогою депресованої функції () Вихід у файл журналу або повідомлення про помилку включає послідовність %u20AC — безпомилковий відбитк знезаненого втечу () функції, що ніхто інший використовує. Ця послідовність не відповідає будь-якому стандарту URL кодування, і декодер вбудований на RFC 3986 або WHATWG правила не визнається. Дані не можуть турбувати через сучасні інструменти. Це загальний знак коду, який предатує ES3 і не було оновлено з 1990-х.
Функція втечу() була розроблена в епоху Netscape, до JavaScript були стандарти або формаль URL правила кодування. Це кодує більшість не-ASCII символи за допомогою %uXX позначення, чотири-цифровий шістнадцятковий код, який ніхто інший використовує і не стандарт визначає в будь-якому місці. Це має сенс для одного з використовується в браузері, але він зламав сумісність з URL стандарти та дані неможливі для декодування в іншому місці.
Втеча() і unescape(): Netscape-era design — Латина1 припущення, %uXXXX винахід і чому він ніколи не відповідає стандартам
втечу() і нерівний пейзаж() припустимо, що вхід латинсько-1 (ISO 8859-1), кодування символів, що заданий UTF-8 та Unicode. Перетворення кожного символу в шістнадцятковий код, використовуючи %XX для високоякісних латинських1 символи та %uXXXX для всього зовні Латина1. Нелатин-1 характер, як смайл не може бути представлений на всіх. Функції прості і швидко, але вони також абсолютно невірні для будь-якого сучасного способу використання.
Обидва функції додано JavaScript до стандартів існували. Вони були відхилені відразу після ES3 вводити належне URL кодування в 1999. Вони залишаються в JavaScript для зворотної сумісності — вимовляючи їх, поламали древнього коду. Але будь-який новий код не повинен використовувати їх. Вони є реліквією спадщини.
ES3 (1999) додає кодURI та кодURIComponent — UTF-8 %-encoding вирівняно з RFC 2396
ES3 введено дві функції: кодURI і кодURIComponent. Як виконати UTF-8 відсотків-encoding: конвертувати неASCII символи до UTF-8 байти, потім напишіть кожну байт як %HH. Як вирівняти RFC 2396, який був струм в часі. RFC 3986 не змінив поведінку кодування. Ці функції все ще стандартні сьогодні і повинні бути використані.
кодування призначений для кодування повного URI; кодування призначений для кодування компонента всередині URI, як значення запиту або сегмента шляху. Відмінність є абсолютно критичною і легкою. encodeURI зберігає структурні символи : / ? # @ = & і ;. encodeURIComponent кодує всіх тих, хто залишив їх безпечною для збирання всередині більшого URI.
Чому ! RFC 2396 'mark' символи заморожені мовою після RFC 3986 перемістити їх
Обидва функції залишають ці символи некодовані: літери, цифри, гіфен (-), андерсон ( ), період (.), тейд (~), п'ять точок пунктуації ! * " ( ). Відзнаки вийшли з RFC 2396, які зазначили їх як незбережені символи «марки». RFC 3986 вийшов 2005 і перемістили п'ять в іншу категорію, але JavaScript вже заморожений кодURI і кодURI Компонент в 1999. Зміна символів, які вони залишають самостійно, буде розбити існуючий код, тому вони залишаються.
Рішення для збереження цих п’яти знаків, які не закодовані для зворотного зв’язку JavaScript's кодування не ідеально відповідати або RFC 3986 чи WHATWG стандарт. Для практичного використання досить близько, і зміни його зараз абсолютно неможливо. Це урок в API стабільність: коли ви замерзли поведінку, ви не можете змінити його навіть якщо стандарт перетворюється.
Зароблений приклад: однаковий рядок через втечу, кодування і кодуванняURIComponent — три виходи у порівнянні
Візьміть рядок "R&Р (дослідження) = кафе. Запустити його через втечу(), кодування Увійти() р%26D%20(дослідження)%20%3Д%20cаф%E9's", змішування невидимих батьків і апотрофії з %-encoded ampersand і рівні. encodeURI виробництво Р&Д%20(дослідження)%20=%20caf%C3%A9's", залишивши знаки ампери і рівні, бо вони є структурними. кодування виробництво Р%26Д%20%28питання%29%20%3Д%20cаф%К3%А9%27s", кодування всіх, включаючи дужки і апотрофію.
Вставте однакову нитку в URL encoder & decoder і перемикач між EncodeURI і EncodeURI Компонент, щоб побачити різницю. Тоді перевірте те, що втеча() буде виробляти (ви можете викликати його в консолі браузера, хоча це буде попереджати вас). Ви бачите відразу, що три функції виробляють три абсолютно різні результати.
Migrating from Escape() — картування старих дзвінків на праву сучасну функцію та обслуговування %uXXXX дані
Старий код, використовуючи втечу() повинен бути оновлений. Якщо втечу() було використано для кодування URI компонент, замініть його за допомогою EncodeURIComponent. Якщо це було використано для кодування URI, використовувати кодування Для зберігання даних, що містяться %uXXXX послідовності, вам потрібно користувальницький декодер: конвертувати кожен %uXXXX до точки коду Unicode, після чого збираємо пункти коду в рядок. JavaScript's вбудований пейзаж() читатиме %uXXXX, але результат не можна виправити UTF-8.
Після заміщення втечу(), перевірте код з рядками, що містять не-ASCII символи, пунктуація та спеціальні символи. Відступ тепер повинен відповідати тим, що сучасні інструменти та стандарти очікують. Якщо дані вашого коду ES3 значною мірою можна також використовувати інші застарілі візерунки; комплексний аудит варто докладати зусиль.
Що це не криється — URL і URLПошукПараметри API, які покриваються окремо
Про нас URL і URLПошукПараметри API, додані набагато пізніше, забезпечують більш високий рівень інтерфейсу для URL кодування компонентів. Вони автоматично керують і збігаються WHATWG URL Стандарт точно. Вони є кращим способом побудови URL-програми JavaScript.
Цей запис охоплює лише функції кодування, а не ті, що вищі API. URL і URLПошукПараметри структури парсера, виберіть правила компонентів і серійноize результату, в той час як конвертер компонентів перетворюється на один поданий рядок без знаючи, де він буде розміщений. Ця відмінність є граничною: мигратувати старе втечу() виклику відповідно до того, чи він ручив значення або адресу, після чого розглянемо заміну зовнішнього ручного позначення з структурованими API як окремий рефактор.
Похід: три функції, одна виживана пара — як працює URL енкодер & decoder показує сучасний кодURI та кодування
Головна JavaScript не втечу(). Функції були стандартизовані в 1999 і не змінився з тих пір. Зашифрувати не-ASCII символи як UTF-8 байти і ручка стандартні зарезервовані символи правильно. Про нас URL енкодер і декодер інструмент реалізує як функції, так і дозволяє бачити їх поведінковий бік, що робить його легко вибрати правильний для вашого компонента.
Якщо ви зіткнулися %u Послідовності в старих журналах або збережених даних, вони втечу () вихід і повинні бути мігровані. Міграція є прямо вперед, коли ви виявите шаблон. Сучасний код не повинен виробляти їх.