Co oznaczają kodowanie i dekodowanie URL?
Kodowanie URL (« url encode », « urlencode ») zamienia każdy niedozwolony znak w adresie — spację, znak diakrytyczny, ampersand, znak plusa — na sekwencję złożoną z procentu i dwóch cyfr szesnastkowych jego bajtu. Dekodowanie URL (« url decode », « decoder url ») czyta te sekwencje od tyłu: bajty są odtwarzane, a następnie konwertowane na znaki zgodnie z deklarowanym kodowaniem, najczęściej UTF-8. To właśnie tej pary szukają osoby wpisujące « encoder decoder url » albo « percent encoding online ».
Percent-encoding nie jest ani kompresją, ani szyfrowaniem: słowo z ogonkiem robi się dwa razy dłuższe i każdy przeczyta je gołym okiem. Jego jedyna rola to przepuszczanie dowolnego bajtu przez URL, który domyślnie dopuszcza tylko część alfabetu ASCII. Odwrotnie, Base64 służy do przesyłania bajtów kanałami czysto tekstowymi — oba wyglądają podobnie, ale nie są wzajemnie zamienne.
Jak zakodować URL w percent-encoding
Krok 1: tekst jest konwertowany na bajty w wybranym kodowaniu, domyślnie UTF-8. Krok 2: dla każdego bajtu sprawdzamy, czy odpowiadający mu znak należy do listy dozwolonych znaków dla wybranego zakresu. Krok 3: jeśli należy, zostaje przepisany bez zmian; w przeciwnym razie staje się %XX, gdzie XX to dwie cyfry szesnastkowe bajtu. Krok 4: jeśli opcja spacji jako + jest włączona, bajt 32 jest zastępowany znakiem plusa zamiast %20.
Przykład: « café & été » w zakresie składnika daje caf%C3%A9%20%26%20%C3%A9t%C3%A9. Po prostu wpisz ten tekst w koderze: wynik, rozmiar wejścia, rozmiar wyjścia i narzut pojawią się jeszcze przed puszczeniem klawisza.
Cztery zakresy kodowania
Zakres składnika zachowuje tylko litery, cyfry i - _ . ! ~ * ' ( ) : to wartość parametru i odpowiada encodeURIComponent. A ciąg zapytania zachowuje ponadto ampersandy i znaki równości, żeby odbudować cały ciąg query string. Segment ścieżki zezwala na / : @ & = + $ , ; żeby nie popsuć ukośników. Pełny URL dodaje jeszcze ?, #, [ i ] : prawie nic nie jest kodowane, tylko spacje i znaki spoza ASCII przechodzą w %XX.
Jak odkodować zakodowany URL
Dekodowanie skanuje ciąg od lewej do prawej: procent i dwie cyfry szesnastkowe dają bajt, każdy inny znak jest przepisywany po konwersji zgodnie z wybranym kodowaniem. Bajty są następnie grupowane i zamieniane na znaki — dwa bajty dla « é », trzy dla « 日 », cztery dla emoji. Zakładka « Dekoduj » wyświetla każdą znalezioną sekwencję, jej pozycję w ciągu, bajty i odpowiadający tekst.
Jeśli po procencie nie ma dwóch prawidłowych cyfr, błąd jest jednoznaczny: niepełna sekwencja lub nieprawidłowy znak szesnastkowy. Przycisk « Napraw % » zamienia samotne procenty w %25, dzięki czemu ciąg staje się dekodowalny bez utraty informacji — najbezpieczniejsza opcja dla częściowo zakodowanego URL-a.
Spacja: %20 czy + — zasada formularzy
%20 to spacja w ścisłym percent-encoding: działa w ścieżce, zapytaniu, fragmencie i nagłówkach. Znak +, jest spacją tylko w formacie application/x-www-form-urlencoded używanym przez formularze HTML i historycznie przez ciągi query string. Gdzie indziej pozostaje zwykłym znakiem plusa — a że bardzo łatwo go pomylić, trzeba go zakodować jako %2B zaraz przy kodowaniu wartości.
W praktyce: aby wypełnić pole formularza lub odtworzyć zachowanie <form>, zaznacz « Spacja jako + ». W przypadku URL-a przekierowania, canonical lub udostępnionego linku zawsze wybieraj %20. Dekoder z kolei traktuje + jak spację domyślnie i to zachowanie można wyłączyć jednym kliknięciem.
RFC 3986: unreserved, sub-delims i gen-delims
RFC 3986 dzieli znaki ASCII na trzy kategorie. Pierwsza to znaki unreserved — litery, cyfry, - _ . ~ — zawsze są zachowywane bez zmian. Kolejną kategorią są sub-delims ! $ & ' ( ) * + , ; = oraz gen-delims : / ? # [ ] @ — mają one znaczenie strukturalne: rozdzielają autorytet, ścieżkę, zapytanie i fragment. Cała reszta — spacja, cudzysłowy, nawiasy kątowe, klamry, procent — musi być zakodowana.
To właśnie te kategorie pokazuje znak po znaku zakładka « RFC 3986 & referencje »: kliknij kafelek, aby zobaczyć jego kod szesnastkowy, kategorię i zakresy, które go zachowują. To najszybsza referencja, by odpowiedzieć na pytanie « czy muszę zakodować ten znak? ».
Znaki diakrytyczne, emoji i UTF-8
URL przesyła tylko bezpieczne bajty ASCII, więc każdy znak powyżej U+007F musi być zakodowany. W UTF-8 « é » to C3 A9 i staje się %C3%A9, « 日 » to trzy bajty i daje trzy sekwencje, emoji zajmuje cztery i rozkłada się na osiem zakodowanych znaków. Jeśli wynik wydaje Ci się długi, to nie bug: to cena kompatybilności ze wszystkimi protokołami. Uważaj też na kodowanie źródłowe — dekodowanie w UTF-8 ciągu zakodowanego w Latin-1 daje dziwaczne znaki, stąd cztery opcje w zakładce « Dekoduj ».
Dlaczego encodeURIComponent nie zawsze wystarcza
encodeURIComponent koduje wszystko oprócz A-Z a-z 0-9 - _ . ! ~ * ' ( ), co pasuje do wartości parametru, ale psuje pełny URL, ponieważ koduje też ukośniki, dwukropki i ampersandy. encodeURI robi odwrotnie: zachowuje strukturę URL, ale przepuszcza spacje i znaki diakrytyczne, więc zawodzi na surowym tekście. Oba warianty są tutaj obsługiwane — i to znacznie więcej, bo zakres « Ciąg zapytania » i zakres « Segment ścieżki » zamykają tę lukę.
Percent-encoding i Base64: dwa różne narzędzia
Percent-encoding podmienia bajt po bajcie i zachowuje czytelność oryginalnego tekstu, kosztem sporego wydłużenia. Base64 grupuje bajty po trzy i przepisuje je w alfabecie 64 znaków: zwarty, ale całkowicie nieczytelny i niezdatny do użycia w URL bez wariantu URL-safe. Zakładka « Kodowania krzyżowe » pokazuje oba na jednym ekranie, a w bonusie bajty szesnastkowe, encje HTML i escapowany ciąg JSON — dzięki temu wybierzesz właściwą reprezentację, zanim cokolwiek skopiujesz.
Częste błędy: podwójne kodowanie i sam %
Najczęstszy błąd to zakodowanie tego samego ciągu dwa razy: spacja staje się %20, potem %2520, a serwer odczytuje dosłownie « %20 ». Druga to zapomnienie o samym procencie, który powinien stać się %25 — w przeciwnym razie dekoder bierze go za początek sekwencji i się wysypuje albo obcina. Wreszcie zachowanie + bez kodowania w parametrze formularza to wstawienie spacji, której nie chciałeś. Dekoder zgłasza źle uformowane sekwencje, a przycisk « Napraw % » naprawia drugi przypadek bez utraty danych.
Gdzie kryją się zakodowane URL-e
W ciągach query string śledzących UTM, w redirect_uri oraz stanach OAuth, w webhooks , których docelowy URL zawiera zagnieżdżone parametry, w URL-e callback podpisanych, w logach serwera, w sitemapach i canonical, w <a href> generowanych po stronie klienta, w JWT których payload jest w Base64URL, w data: oraz nagłówkach Location, a także w każdym formularzu HTML wysyłanym metodą GET. Szybkie kodowanie i dekodowanie pozwala nie otwierać terminala dla jednego ciągu.
Wydajność i dobre praktyki
W przeglądarce kodowanie i dekodowanie są liniowe i prawie nic nie kosztują, nawet na kilku megabajtach: każdy znak jest przetwarzany tylko raz, bez rekursji i bez alokacji na znak. Jedyne pułapki to podwójne kodowanie — zawsze sprawdzaj round-trip przed zapisem — oraz URL-e wielokilobajtowe, które proxy często obcinają powyżej 2 000 znaków. Dokumentuj użyty zakres obok wygenerowanego ciągu: « składnik » i « pełny URL » nie dają tego samego wyniku na tym samym tekście.
Polecane dla
programistów backendu i frontendu (query strings, przekierowania, OAuth), integratorów i autorów treści technicznych (linki UTM, canonical, tracking), administratorów i DevOpsów (webhooki, podpisane URL-e, logi), testerów i pentesterów (fuzzing parametrów, omijanie filtrów), studentów (zrozumienie UTF-8, ASCII i RFC 3986) oraz każdej osoby potrzebującej kodera i dekodera URL online szybkiego, kompletnego i dyskretnego — a jako uzupełnienie koder i dekoder Base64 oraz formatator JSON.