Encode URL mengubah karakter menjadi % dan dua digit heksadesimal
Di URL, hanya huruf, angka, dan beberapa simbol yang boleh ditulis apa adanya. Karakter lain diubah dulu menjadi byte, lalu setiap byte ditulis sebagai % diikuti dua digit heksadesimal. Cara ini disebut percent-encoding atau encode URL. Dalam UTF-8, huruf seperti 'é' berukuran 2 byte sehingga menjadi %C3%A9, sedangkan spasi menjadi %20 (atau + pada pengiriman form). Decode URL adalah kebalikannya: setiap %XX dikembalikan menjadi byte, lalu dibaca sebagai karakter.
Teks yang sama bisa menghasilkan encode yang berbeda tergantung posisinya di URL. Teks yang akan dipakai sebagai satu nilai, misalnya kata kunci pencarian, harus ikut mengubah &, =, /, dan ?. Teks yang sudah berbentuk URL justru harus mempertahankan tanda pemisah itu agar tetap bisa dibuka. Alat ini langsung mengonversi berdasarkan kolom yang terakhir Anda ubah, membedah URL per bagian, serta mengenali URL lama dari situs berbasis Windows-1252 dan nilai yang di-encode dua kali. Encode URL bukan enkripsi, jadi siapa pun bisa mengembalikannya ke teks asli.
Kapan URL perlu di-encode atau di-decode
- URL yang ditempel penuh tanda %: URL di chat atau dokumen yang terlihat seperti
nasi%20goreng%20%26%20sate…sulit dikenali. Tempel ke kolom encode, dan kata kunci serta path terbaca kembali. - Memasukkan kata kunci atau nama produk ke tautan: 'Nasi & Sate' atau 'C++' yang ditempel apa adanya membuat bagian setelah
&dibaca sebagai parameter lain dan+dibaca sebagai spasi. Ubah dengan aturan satu nilai agar terkirim utuh. - Mengirim URL tujuan setelah login atau pembayaran: URL yang dimasukkan ke
redirect_uriataureturnUrlharus di-encode seluruhnya agar tidak tercampur dengan URL luar. - Membuat tanda tangan API: tanda tangan OAuth 1.0 dan AWS Signature Version 4 mengharuskan hanya karakter unreserved RFC 3986 yang dibiarkan, dengan spasi ditulis
%20. Selisih satu karakter saja membuat autentikasi gagal. - Membaca URL di log atau alat analitik: log server dan sumber kunjungan menyimpan URL dalam bentuk ter-encode. Untuk melihat kata kunci yang dipakai pengunjung, URL itu perlu di-decode.
- Membaca URL dari situs atau form PHP lama: situs yang halamannya memakai Windows-1252 (ISO-8859-1) menulis 'café' sebagai
caf%E9, sehingga decoder UTF-8 menampilkannya rusak.
Cara memakai
- Decode: tempel URL atau nilai yang mengandung % di kolom Encode URL di sisi kanan. Aturan dipilih dari bentuk teks yang ditempel (URL utuh untuk URL, Form + jika ada + sebagai spasi), dan hasil decode muncul di kolom Teks asli di sisi kiri.
- Encode: ketik teks di kolom Teks asli di sisi kiri, lalu pilih aturan yang sesuai dengan tempat teks itu akan dipakai. Pilih 'Satu nilai' untuk kata kunci, nama file, atau URL tujuan; 'URL utuh' untuk URL lengkap; 'Form +' jika perlu hasil yang sama dengan form HTML; dan 'Ketat' untuk tanda tangan.
- Melihat bedah URL: jika isi kolom berupa URL atau query string, alat ini membaginya menjadi skema, host, path, nilai query, dan fragmen, lalu men-decode masing-masing. Jika di dalam nilai ada URL lain, tombol 'Decode URL ini' membukanya lagi. Pada teks beberapa baris, yang dibedah adalah baris tempat kursor berada.
- Encoding karakter: nilai bawaan adalah deteksi otomatis. Jika tidak terbaca sebagai UTF-8, teks dibaca sebagai EUC-KR, Shift_JIS, atau Windows-1252 yang paling cocok, dan hasilnya ditampilkan di samping. Untuk meng-encode bagi situs lama, pilih sendiri encodingnya.
- Peta simbol dan hasil per fungsi: tekan simbol untuk melihat hasilnya pada keempat aturan beserta alasannya. Hasil per bahasa dan fungsi adalah hasil teks di kolom Teks asli yang diubah dengan fungsi JavaScript, PHP, dan Python, dengan bagian yang berbeda dari aturan saat ini ditandai. Tekan satu baris untuk menyalin hasilnya.
Empat aturan: apa yang dibiarkan
Tiap aturan membiarkan simbol yang berbeda selain huruf dan angka. Jika hasilnya berbeda dari alat atau kode lain, penyebabnya biasanya perbedaan ini.
| Aturan | Simbol yang dibiarkan (selain huruf dan angka) | Spasi | % yang sudah ada | Dipakai untuk · fungsi yang sama |
|---|---|---|---|---|
| Satu nilai | - _ . ! ~ * ' ( ) | %20 | Menjadi %25 | Nilai query, segmen path · JavaScript encodeURIComponent() |
| URL utuh | Tanda pemisah : / ? # [ ] @ ! $ & ' ( ) * + , ; = dan - . _ ~ (beberapa berbeda menurut posisi) | %20 | Dibiarkan | Address bar, tautan · URL Standard di browser |
| Form + | * - . _ | + | Menjadi %25 | Pengiriman form HTML · URLSearchParams, Java URLEncoder |
| Ketat | - . _ ~ | %20 | Menjadi %25 | OAuth 1.0, tanda tangan AWS · PHP rawurlencode() |
Keempat simbol pada aturan ketat ditetapkan RFC 3986 sebagai karakter unreserved, sehingga di-encode atau tidak, keduanya dianggap URL yang sama. Aturan satu nilai juga membiarkan ! ' ( ) * karena JavaScript mengikuti karakter unreserved dari RFC 2396, standar lama, dan URL Standard juga menetapkan himpunan ini secara terpisah sebagai himpunan component.
Aturan Form + sama dengan URLSearchParams. Saat browser benar-benar mengirim form HTML, baris baru di kolom multibaris dikirim sebagai %0D%0A, sedangkan alat ini dan URLSearchParams membiarkannya sebagai %0A (diukur di Chromium 151).
Per simbol
Tabel ini merangkum bagaimana simbol yang sering membingungkan diubah pada tiap aturan. Kolom URL utuh mengacu pada posisi query di URL http atau https. Di peta simbol di atas alat, Anda bisa menekan ke-35 simbol satu per satu.
| Simbol | Satu nilai | URL utuh (query) | Form + | Ketat | encodeURI() |
|---|---|---|---|---|---|
| spasi | %20 | %20 | + | %20 | %20 |
| & | %26 | & | %26 | %26 | & |
| = | %3D | = | %3D | %3D | = |
| + | %2B | + | %2B | %2B | + |
| / | %2F | / | %2F | %2F | / |
| ? | %3F | ? | %3F | %3F | ? |
| # | %23 | # | %23 | %23 | # |
| % | %25 | % | %25 | %25 | %25 |
| ~ | ~ | ~ | %7E | ~ | ~ |
| * | * | * | * | %2A | * |
| ' | ' | %27 | %27 | %27 | ' |
| ! | ! | ! | %21 | %21 | ! |
| é | %C3%A9 | %C3%A9 | %C3%A9 | %C3%A9 | %C3%A9 |
Aturan URL utuh membiarkan % agar %XX yang sudah di-encode tetap terjaga. Sebagai gantinya, jika ada karakter % yang sebenarnya, dua karakter setelahnya harus dicek apakah heksadesimal, sehingga alat ini memberi tahu jumlah % seperti itu. urlencode() PHP mirip aturan form, tetapi * juga menjadi %2A, sedangkan quote() Python sama dengan aturan ketat dengan tambahan / yang dibiarkan.
%20 dan +: bagaimana spasi dibaca
Menulis spasi sebagai + adalah aturan pengiriman form HTML (application/x-www-form-urlencoded). Di path, + hanyalah tanda plus. Di query pun, apakah menjadi spasi atau tetap plus bergantung pada fungsi yang dipakai penerima untuk men-decode. Jika plus yang sebenarnya ditulis %2B dan spasi ditulis %20, keduanya dibaca sama di mana pun.
| Fungsi | Hasil | + menjadi spasi |
|---|---|---|
JavaScript decodeURIComponent() | a+b c+ | Tidak |
JavaScript URLSearchParams | a b c+ | Ya |
PHP urldecode() | a b c+ | Ya |
PHP rawurldecode() | a+b c+ | Tidak |
Python unquote() | a+b c+ | Tidak |
Python unquote_plus() | a b c+ | Ya |
Alat ini hanya membaca + sebagai spasi pada aturan Form +. Jika Anda men-decode dengan aturan satu nilai atau ketat dan + masih ada, tombol 'Baca dengan aturan Form +' muncul di baris status. Aturan URL utuh membiarkan + demi menjaga struktur, dan bedah URL di bawahnya hanya men-decode nilai query dengan aturan form.
Meng-encode URL utuh: perbedaan encodeURI dan browser
encodeURI(), yang sering dipakai untuk URL utuh, membiarkan tanda pemisah tetapi juga mengubah % dan tidak memperlakukan domain secara khusus. Address bar browser mengikuti URL Standard: himpunan yang dipakai berbeda untuk path, query, dan fragmen, %XX yang sudah ada dibiarkan, dan domain IDN diubah menjadi Punycode. Aturan URL utuh di alat ini mengikuti cara browser.
| Teks asli | encodeURI() | URL utuh (URL Standard) |
|---|---|---|
https://example.com/a%20b | https://example.com/a%2520b | https://example.com/a%20b |
https://bücher.de/ | https://b%C3%BCcher.de/ | https://xn--bcher-kva.de/ |
https://example.com/?q=[1] | https://example.com/?q=%5B1%5D | https://example.com/?q=[1] |
https://example.com/?q=it's | https://example.com/?q=it's | https://example.com/?q=it%27s |
https://example.com/?next=https://b.com/?x=1&y=2 | https://example.com/?next=https://b.com/?x=1&y=2 | https://example.com/?next=https://b.com/?x=1&y=2 |
Seperti pada baris terakhir, jika URL lain dimasukkan apa adanya ke dalam nilai, kedua cara tidak bisa memperbaikinya, karena URL luar membaca y=2 sebagai itemnya sendiri. URL dalam harus di-encode terpisah dengan aturan satu nilai, lalu ditempelkan seperti next=https%3A%2F%2Fb.com%2F%3Fx%3D1%26y%3D2. Jika menemukan nilai seperti itu pada aturan URL utuh, alat ini memberi tahu lewat baris status.
Encode dua kali dan decode satu lapis
Jika teks yang sudah di-encode di-encode lagi, % menjadi %25. Karena itu %20 menjadi %2520, lalu sekali decode menghasilkan %20 dan baru decode kedua menghasilkan spasi. Ini sering terjadi ketika framework atau library HTTP sudah meng-encode nilai secara otomatis, tetapi kode Anda mengubahnya sekali lagi. RFC 3986 bagian 2.4 juga menetapkan agar teks yang sama tidak di-encode atau di-decode dua kali.
| Kali | Hasil | Panjang |
|---|---|---|
| 1 kali | kopi%20caf%C3%A9 | 16 karakter |
| 2 kali | kopi%2520caf%25C3%25A9 | 22 karakter |
| 3 kali | kopi%252520caf%2525C3%2525A9 | 28 karakter |
Jika di kolom encode terlihat %25 diikuti dua digit heksadesimal, alat ini menduga teks di-encode dua kali dan menampilkan tombol 'Decode satu lapis lagi'. Tombol ini hanya mengubah %25XX menjadi %XX, sehingga tanda pemisah lain di URL tidak tersentuh. Namun, jika teks aslinya memang berisi tulisan '%20' itu sendiri, decode satu lapis lagi justru mengubah teks, jadi periksa dulu asalnya.
URL lama yang di-encode dengan Windows-1252
URL masa kini memakai UTF-8 sebagai dasar (RFC 3986 bagian 2.5), tetapi situs lama, misalnya halaman dan form PHP yang dibuat dengan Windows-1252 (mirip ISO-8859-1), meng-encode kata kunci dari form dengan byte itu juga. Satu huruf Eropa Barat hanya 1 byte, sehingga 'é' menjadi %E9. URL Standard juga menetapkan bahwa query URL http dan https diubah dengan encoding halaman, sedangkan path selalu dengan UTF-8.
| Karakter | UTF-8 | Windows-1252 |
|---|---|---|
| é | %C3%A9 | %E9 |
| ü | %C3%BC | %FC |
| ç | %C3%A7 | %E7 |
| € | %E2%82%AC | %80 |
| A | A | A |
Jika nilai Windows-1252 di-decode sebagai UTF-8, byte tidak cocok dan muncul �. Deteksi otomatis alat ini lebih dulu mencoba membaca sebagai UTF-8; jika gagal, ia membandingkan hasil bacaan EUC-KR, Shift_JIS, dan Windows-1252, lalu memilih yang paling banyak memuat karakter umum. Sebaliknya, untuk membuat nilai yang akan dikirim ke situs lama, pilih Windows-1252 sebagai encoding karakter. Karakter yang tidak ada di Windows-1252 (emoji, misalnya) ditulis seperti pada form browser, yaitu &#nomor; yang di-encode menjadi %26%23nomor%3B.
Domain IDN diubah menjadi Punycode
Domain (host) tidak memakai percent-encoding. Domain dengan huruf non-ASCII diubah menurut aturan nama domain internasional (IDNA) menjadi nama ASCII yang diawali xn-- (Punycode, RFC 3492). Aturan URL utuh hanya mengubah host dengan cara ini, sedangkan huruf non-ASCII di path dan query menjadi %XX. Saat decode, nama xn-- ditampilkan kembali sebagai huruf aslinya.
| Domain | Punycode |
|---|---|
| café.fr | xn--caf-dma.fr |
| bücher.de | xn--bcher-kva.de |
| españa.es | xn--espaa-rta.es |
| 例え.jp | xn--r8jz45g.jp |
Dengan kode
// JavaScript
encodeURIComponent('Nasi & Sate / C++'); // Nasi%20%26%20Sate%20%2F%20C%2B%2B
decodeURIComponent('kopi%20caf%C3%A9'); // kopi café (URIError jika ada % yang tidak valid)
new URLSearchParams({ q: 'nasi goreng' }).toString(); // q=nasi+goreng
new URL('https://café.example/menu').href; // https://xn--caf-dma.example/menu
# Python
from urllib.parse import quote, quote_plus, unquote, urlencode
quote('kopi café', safe='') # kopi%20caf%C3%A9
quote_plus('kopi café') # kopi+caf%C3%A9
unquote('caf%E9', encoding='cp1252') # café (Windows-1252)
urlencode({'q': 'nasi goreng', 'page': 2}) # q=nasi+goreng&page=2
// PHP
rawurlencode('kopi café'); // kopi%20caf%C3%A9
urlencode('kopi café'); // kopi+caf%C3%A9
http_build_query(['q' => 'nasi goreng', 'page' => 2]);
// Java
URLEncoder.encode("kopi café", StandardCharsets.UTF_8); // kopi+caf%C3%A9
URLDecoder.decode("kopi+caf%C3%A9", StandardCharsets.UTF_8); // kopi café
Fungsi beraturan form (URLSearchParams, quote_plus() Python, urlencode() PHP, dan URLEncoder Java) menulis spasi sebagai +. Untuk nilai yang akan masuk ke path atau dipakai untuk tanda tangan, gunakan fungsi yang menghasilkan %20.
Kesalahan yang sering terjadi
- URL utuh di-encode dengan aturan satu nilai: hasilnya
https%3A%2F%2F…dan tidak bisa dibuka sebagai tautan. Pakai aturan URL utuh untuk memperbaiki URL itu sendiri, dan aturan satu nilai hanya jika URL itu menjadi nilai di URL lain. - & atau # di dalam nilai dibiarkan: pada 'A&B', hanya A yang terkirim, dan bagian setelah # tidak dikirim ke server. Dengan aturan satu nilai, hasilnya
A%26Bdan%23. - C++ berubah menjadi 'C' dan dua spasi: penyebabnya,
+dimasukkan apa adanya ke sisi yang men-decode dengan aturan form. TulisC%2B%2B. - Di-encode dua kali seperti %2520: sering terjadi karena nilai yang sudah di-encode oleh library di-encode lagi secara manual. Tetapkan satu tahap saja untuk melakukan encode.
- Nilai Windows-1252 di-decode sebagai UTF-8: huruf rusak atau muncul �. Ganti encoding karakter menjadi Windows-1252 lalu decode.
- decodeURIComponent berhenti: jika setelah % tidak ada dua digit heksadesimal, seperti pada '100%', fungsi berhenti dengan
URIError. Alat ini membiarkan % seperti itu dan memberi tahu posisinya.
Batasan
- Alat ini hanya menghitung perubahan karakter. Ia tidak memeriksa apakah URL benar-benar bisa dibuka atau aman, dan tidak mengakses URL itu.
- Aturan URL utuh hanya menerapkan himpunan per komponen dari URL Standard. Perapian lain yang dilakukan browser (huruf kecil pada skema dan host, penyelesaian
../, penghapusan port bawaan, penambahan / pada path kosong) tidak dilakukan. Beberapa simbol bisa berbeda antarbrowser, misalnya Chrome 151 juga mengubah|di path menjadi%7C. - URL non-http dan non-https seperti mailto: juga diubah dengan himpunan path. Penanganan spasinya bisa berbeda dari aturan URL Standard untuk path semacam itu (opaque path).
- Deteksi otomatis hanyalah perkiraan. Nilai yang pendek atau karakter yang jarang muncul bisa terbaca sebagai encoding lain, jadi pilih sendiri jika hasilnya aneh. Encoding lama yang didukung hanya EUC-KR, Shift_JIS, dan Windows-1252; EUC-JP, Big5, dan lainnya tidak ada.
- Bedah URL hanya membaca dan menyalin. Untuk mengubah atau menambah item query, gunakan alat tabel query URL ↔ item. Hasil per bahasa dan fungsi hanya membandingkan 4.000 karakter pertama teks asli.
Acuan: himpunan encode mengacu pada URL Standard (edisi 19 Oktober 2026) dan RFC 3986, aturan tanda tangan pada RFC 5849 dan dokumentasi AWS, dan perilaku fungsi pada dokumentasi tiap bahasa, semuanya dicek pada 22 Oktober 2026. Nilai di tabel dipastikan sama dengan alat ini serta PHP 8.5, Python 3.14, Node.js 26, dan Chromium 151.
Sumber
- 01WHATWG: URL Standard, Percent-encoded bytesHimpunan fragment, query, special-query, path, userinfo, component, dan form; encoding lama serta penanganan &#nomor;
- 02WHATWG: application/x-www-form-urlencodedSerialisasi form (spasi → +) dan decode (+ → spasi)
- 03RFC 3986: Uniform Resource Identifier (URI): Generic Syntax2.1 heksadesimal huruf besar, 2.2 karakter reserved, 2.3 karakter unreserved, 2.4 larangan encode dua kali, 2.5 UTF-8, lampiran B (regex)
- 04ECMAScript: URI Handling FunctionsDefinisi encodeURI, encodeURIComponent, dan decodeURIComponent
- 05MDN: encodeURIComponent()Karakter yang dibiarkan dan URIError untuk surrogate tanpa pasangan
- 06RFC 5849 3.6: OAuth 1.0 Percent EncodingHanya karakter unreserved yang dibiarkan; sisanya heksadesimal huruf besar
- 07AWS: Create a signed AWS API requestUriEncode: hanya karakter unreserved yang dibiarkan, spasi %20, heksadesimal huruf besar
- 08PHP: urlencodeSemua selain -_. diubah, spasi menjadi +; versi RFC 3986 adalah rawurlencode
- 09Python: urllib.parse.quote_.-~ dibiarkan, safe bawaan '/', quote_plus mengubah spasi menjadi +
- 10Java: URLEncoder. - * _ dibiarkan, spasi menjadi +, UTF-8 disarankan
- 11RFC 3492: PunycodeNama xn-- untuk nama domain internasional
- 12WHATWG: Encoding StandardInterpretasi EUC-KR (termasuk ekstensi CP949), Shift_JIS, dan Windows-1252
Pertanyaan yang sering diajukan
Apa itu encode dan decode URL?
Encode URL adalah menulis karakter yang tidak boleh langsung dipakai di URL sebagai % diikuti dua digit heksadesimal untuk tiap byte, dan decode adalah mengembalikan tulisan itu menjadi karakter asli. Huruf 'é' berukuran 2 byte dalam UTF-8, jadi menjadi %C3%A9 dan kembali menjadi 'é' saat di-decode. Ini hanya cara penulisan, bukan enkripsi, sehingga siapa pun bisa mengembalikannya.
Apa beda encodeURI dan encodeURIComponent?
encodeURIComponent dipakai untuk satu nilai, jadi tanda pemisah seperti & = / ? # : juga diubah, sedangkan encodeURI dipakai untuk URL utuh dan membiarkan simbol itu. Karena itu, jika kata kunci 'A&B' di-encode dengan encodeURI, tanda & tetap ada dan nilainya terbelah dua. encodeURI juga mengubah %20 yang sudah ada menjadi %2520, jadi untuk URL utuh aturan 'URL utuh' (URL Standard) di alat ini lebih aman.
Spasi itu %20 atau +?
Keduanya dipakai. Di path dan sebagian besar nilai, spasi adalah %20, sedangkan pengiriman form HTML dan URLSearchParams menulis spasi sebagai +. Saat decode pun, decodeURIComponent, rawurldecode PHP, dan unquote Python membiarkan +, sedangkan URLSearchParams, urldecode PHP, dan unquote_plus Python membacanya sebagai spasi. Jika plus yang sebenarnya ditulis %2B dan spasi ditulis %20, tidak akan ada kebingungan di mana pun.
Mengapa % berubah menjadi %25 sehingga muncul %2520?
Karena teks yang sudah di-encode di-encode sekali lagi. % adalah penanda encoding, sehingga karakter % menjadi %25 dan %20 menjadi %2520. RFC 3986 juga menetapkan agar teks yang sama tidak di-encode atau di-decode dua kali. Jika nilai yang ditempel di kolom encode memuat %25, tombol 'Decode satu lapis lagi' bisa melepasnya satu lapis demi satu lapis.
Hasil decode berantakan atau muncul �. Mengapa?
Kemungkinan besar nilai itu dibuat dengan encoding selain UTF-8. Situs lama berbasis Windows-1252 menulis 'café' sebagai caf%E9, dan jika dibaca sebagai UTF-8, hasilnya rusak. Jika tidak terbaca sebagai UTF-8, alat ini memilih EUC-KR, Shift_JIS, atau Windows-1252 yang paling cocok, dan Anda juga bisa memilihnya sendiri di kolom encoding karakter.
Apakah domain IDN juga di-encode dengan %?
Tidak. Domain tidak memakai percent-encoding, melainkan nama ASCII berawalan xn-- hasil konversi Punycode. café.fr menjadi xn--caf-dma.fr. Aturan 'URL utuh' hanya mengubah domain menjadi Punycode, sedangkan huruf non-ASCII di path dan query menjadi %XX.
Bagaimana memasukkan URL lain sebagai nilai query?
Encode URL dalam itu seluruhnya dengan aturan 'Satu nilai', lalu tempelkan. https://b.com/?x=1&y=2 menjadi https%3A%2F%2Fb.com%2F%3Fx%3D1%26y%3D2, sehingga setelah redirect= tanda & ? # tidak dibaca sebagai pemisah URL luar. Di bedah URL, alat ini menemukan URL di dalam nilai, dan tombol 'Decode URL ini' membukanya lagi.
Apakah URL yang saya masukkan dikirim ke server?
Tidak. Encode, decode, bedah URL, dan konversi domain semuanya dihitung di dalam browser ini. Teks yang Anda masukkan tidak dikirim atau disimpan di server dan tidak ditinggalkan di alamat halaman. Meskipun URL berisi kata sandi atau token, datanya tidak keluar dari halaman ini.