URL Encode JavaScript — encodeURIComponent()
Používejte bezplatný URL Encode Online přímo v prohlížeči — bez instalace.
Vyzkoušet URL Encode Online online →Při tvorbě vyhledávací URL, předávání cesty přesměrování jako parametru dotazu nebo při sestavování OAuth autorizačního požadavku budou speciální znaky jako &, = a mezery tiše poškodit URL, pokud je nejprve URL-nekódujete. JavaScript nabízí tři vestavěné přístupy — encodeURIComponent(), encodeURI() a URLSearchParams — každý navržený pro jiný případ použití. Volba nesprávného je kořenovou příčinou většiny chyb kódování, na které jsem narazil při kontrolách kódu. Pro rychlé jednorázové kódování bez kódu to URL Encoder od ToolDeck zvládne okamžitě v prohlížeči. Tato příručka podrobně pokrývá všechny tři přístupy (JavaScript ES2015+ / Node.js 10+): kdy který použít, jak se liší pro mezery a rezervované znaky, praktické vzory Fetch a API, použití CLI a čtyři chyby způsobující nejvíce zákeřných produkčních problémů.
- ✓encodeURIComponent() je správná volba pro kódování jednotlivých hodnot parametrů — kóduje každý znak kromě A–Z, a–z, 0–9 a - _ . ! ~ * ' ( )
- ✓encodeURI() kóduje kompletní URL a přitom zachovává strukturální znaky (/ ? # & = :) — nikdy jej nepoužívejte pro jednotlivé hodnoty
- ✓URLSearchParams automaticky kóduje páry klíč–hodnota ve formátu application/x-www-form-urlencoded, kde mezery se stávají + místo %20
- ✓Dvojité kódování je nejčastější chybou v produkci: encodeURIComponent(encodeURIComponent(value)) změní %20 na %2520
- ✓Knihovna qs nativně zpracovává vnořené objekty a pole v query stringách — standardní URLSearchParams to neumí
Co je URL kódování?
URL kódování (formálně nazývané percent-kódování, definované v RFC 3986) převádí znaky, které nejsou povoleny nebo mají speciální význam v URL, na bezpečnou reprezentaci. Každý nebezpečný bajt je nahrazen znakem procenta následovaným dvěma hexadecimálními číslicemi — ASCII kódem daného znaku. Mezera se stane %20, ampersand se stane %26, lomítko se stane %2F.
Znaky, které jsou vždy bezpečné a nikdy se nekódují, se nazývají nerezervované znaky: písmena A–Z a a–z, číslice 0–9 a čtyři symboly - _ . ~. Vše ostatní musí být buď zakódováno při použití jako data, nebo má strukturální roli v samotné URL (jako / pro oddělení segmentů cesty nebo &pro oddělení parametrů dotazu). Praktický důsledek: název produktu jako “Wireless Keyboard & Mouse” v parametru dotazu zničí strukturu URL, pokud je předán nekódovaný.
https://shop.example.com/search?q=Wireless Keyboard & Mouse&category=peripherals
https://shop.example.com/search?q=Wireless%20Keyboard%20%26%20Mouse&category=peripherals
encodeURIComponent() — Správná funkce pro parametry dotazu
encodeURIComponent() je tahounem URL kódování v JavaScriptu. Kóduje každý znak kromě nerezervované sady (A–Z, a–z, 0–9, - _ . ! ~ * ' ( )). Zásadní je, že kóduje všechny znaky mající strukturální význam v URL — &, =, ?, #, / — díky čemuž je bezpečná pro použití v hodnotách parametrů. Není potřeba žádný import; je to globální funkce dostupná ve všech prostředích JavaScriptu.
Minimální funkční příklad
// Encode a search query parameter that contains special characters
const searchQuery = 'Wireless Keyboard & Mouse'
const filterStatus = 'in-stock'
const maxPrice = '149.99'
const searchUrl = `https://shop.example.com/products?` +
`q=${encodeURIComponent(searchQuery)}` +
`&status=${encodeURIComponent(filterStatus)}` +
`&maxPrice=${encodeURIComponent(maxPrice)}`
console.log(searchUrl)
// https://shop.example.com/products?q=Wireless%20Keyboard%20%26%20Mouse&status=in-stock&maxPrice=149.99Kódování přesměrovací URL jako parametru dotazu
// The redirect destination is itself a URL — it must be fully encoded
// or the outer URL parser will misinterpret its ? and & as its own
const redirectAfterLogin = 'https://dashboard.internal/reports?view=weekly&team=platform'
const loginUrl = `https://auth.company.com/login?next=${encodeURIComponent(redirectAfterLogin)}`
console.log(loginUrl)
// https://auth.company.com/login?next=https%3A%2F%2Fdashboard.internal%2Freports%3Fview%3Dweekly%26team%3Dplatform
// Decoding on the receiving end
const params = new URLSearchParams(window.location.search)
const next = params.get('next') // Automatically decoded
const nextUrl = new URL(next!) // Safe to parse
console.log(nextUrl.hostname) // dashboard.internalKódování znaků mimo ASCII a Unicode
// encodeURIComponent handles Unicode natively in all modern environments
// Each UTF-8 byte of the character is percent-encoded
const customerName = 'Novák, Tomáš'
const productTitle = '東京 wireless adapter'
const reviewText = 'Velmi dobré — funguje perfektně'
console.log(encodeURIComponent(customerName))
// Nov%C3%A1k%2C%20Tom%C3%A1%C5%A1
console.log(encodeURIComponent(productTitle))
// %E6%9D%B1%E4%BA%AC%20wireless%20adapter
console.log(encodeURIComponent(reviewText))
// Velmi%20dobr%C3%A9%20%E2%80%94%20funguje%20perfektn%C4%9B
// Decoding back
console.log(decodeURIComponent('Nov%C3%A1k%2C%20Tom%C3%A1%C5%A1'))
// Novák, TomášencodeURIComponent() využívá interní UTF-16 kódování řetězců javascriptového enginu a poté kóduje každý UTF-8 bajt znaku samostatně. Znak jako ü (U+00FC) se zakóduje na %C3%BC, protože jeho UTF-8 reprezentace tvoří dva bajty: 0xC3 a 0xBC. To je správně a odpovídá standardu URI — servery mají dekódovat UTF-8 bajtovou sekvenci zpět na původní kódový bod.Funkce JavaScriptu pro URL kódování — Přehled znaků
Tři nativní přístupy ke kódování se liší v tom, které znaky přesně kódují. Tabulka níže ukazuje výstup pro nejčastěji problematické znaky:
| Znak | Role v URL | encodeURIComponent() | encodeURI() | URLSearchParams |
|---|---|---|---|---|
| Space | oddělovač slov | %20 | %20 | + |
| & | oddělovač parametrů | %26 | zachováno | %26 |
| = | klíč=hodnota | %3D | zachováno | %3D |
| + | kódovaná mezera (form) | %2B | %2B | %2B |
| ? | začátek dotazu | %3F | zachováno | %3F |
| # | fragment | %23 | zachováno | %23 |
| / | oddělovač cesty | %2F | zachováno | %2F |
| : | schéma / port | %3A | zachováno | %3A |
| @ | oddělovač auth | %40 | zachováno | %40 |
| % | literál procenta | %25 | %25 | %25 |
| ~ | nerezervovaný | zachováno | zachováno | zachováno |
Kritickým sloupcem je encodeURIComponent() vs. encodeURI() pro & a =: encodeURI() je ponechá beze změny, což je správné při kódování celé URL, ale katastrofální při kódování hodnoty tyto znaky obsahující.
encodeURI() — Kdy zachovat strukturu URL
encodeURI() je navržena pro kódování kompletní URL— zachovává všechny znaky, které jsou platnými strukturálními částmi URI: schéma (https://), hostitele, oddělovače cesty, oddělovače dotazu a identifikátor fragmentu. Použijte ji, pokud obdržíte URL, která může obsahovat mezery nebo znaky mimo ASCII v segmentech cesty, ale potřebujete zachovat její strukturu neporušenou.
Sanitace URL zadané uživatelem
// A URL pasted from a document with spaces in the path and non-ASCII chars const rawUrl = 'https://cdn.example.com/assets/product images/München chair.png' const safeUrl = encodeURI(rawUrl) console.log(safeUrl) // https://cdn.example.com/assets/product%20images/M%C3%BCnchen%20chair.png // encodeURIComponent would break it — it encodes the :// and all / characters const broken = encodeURIComponent(rawUrl) console.log(broken) // https%3A%2F%2Fcdn.example.com%2Fassets%2Fproduct%20images%2FM%C3%BCnchen%20chair.png // ↑ Not a valid URL — the scheme and slashes are destroyed
URL je obvykle lepší volbou než encodeURI() pro práci s URL řetězci zadanými uživatelem — normalizuje URL, validuje strukturu a poskytuje čisté API pro přístup ke každé komponentě. Rezervujte encodeURI() pro případy, kde potřebujete řetězcový výsledek a již víte, že vstup je strukturálně platnou URL.URLSearchParams — Moderní přístup pro query stringy
URLSearchParams je idiomatický způsob sestavování a parsování query stringů v moderním JavaScriptu. Je globálně dostupná ve všech moderních prohlížečích a Node.js 10+, přičemž kódování zpracovává automaticky — pracujete s prostými páry klíč–hodnota a ona produkuje správný výstup. Jeden důležitý detail: sleduje specifikaci application/x-www-form-urlencoded, která kóduje mezery jako + místo %20. To je správné a široce podporované, ale měli byste na to pamatovat, pokud váš server očekává konkrétní formát.
Sestavení URL vyhledávacího požadavku
// Building a search API URL with multiple parameters
const filters = {
query: 'standing desk',
category: 'office-furniture',
minPrice: '200',
maxPrice: '800',
inStock: 'true',
sortBy: 'price_asc',
}
const params = new URLSearchParams(filters)
const apiUrl = `https://api.example.com/v2/products?${params}`
console.log(apiUrl)
// https://api.example.com/v2/products?query=standing+desk&category=office-furniture&minPrice=200&maxPrice=800&inStock=true&sortBy=price_asc
// Appending additional params after construction
params.append('page', '2')
params.append('tag', 'ergonomic & adjustable')
console.log(params.toString())
// query=standing+desk&...&tag=ergonomic+%26+adjustableParsování příchozího query stringu
// Both browser (window.location.search) and Node.js (req.url) scenarios
function parseWebhookCallbackUrl(rawSearch: string) {
const params = new URLSearchParams(rawSearch)
return {
eventId: params.get('event_id'), // null if missing
timestamp: Number(params.get('ts')),
signature: params.get('sig'),
redirectUrl: params.get('redirect'), // Automatically decoded
tags: params.getAll('tag'), // Handles repeated keys
}
}
const callbackQuery = '?event_id=evt_9c2f&ts=1717200000&sig=sha256%3Dabc123&redirect=https%3A%2F%2Fdashboard.internal%2F&tag=payment&tag=webhook'
const parsed = parseWebhookCallbackUrl(callbackQuery)
console.log(parsed.redirectUrl) // https://dashboard.internal/
console.log(parsed.tags) // ['payment', 'webhook']Jak URL-kódovat parametry v JavaScript Fetch požadavcích
Nejběžnějším místem, kde se URL kódování vyskytuje v produkčním kódu, jsou volání fetch() — buď při sestavování URL požadavku nebo při odesílání dat formuláře v těle požadavku. Každý scénář má svůj vlastní správný přístup.
GET požadavek — kódování parametrů dotazu
async function searchInventory(params: {
sku?: string
warehouse: string
minStock: number
updatedAfter?: Date
}): Promise<{ items: unknown[]; total: number }> {
const searchParams = new URLSearchParams()
if (params.sku) searchParams.set('sku', params.sku)
searchParams.set('warehouse', params.warehouse)
searchParams.set('min_stock', String(params.minStock))
if (params.updatedAfter) searchParams.set('updated_after', params.updatedAfter.toISOString())
const url = `https://inventory.internal/api/items?${searchParams}`
const res = await fetch(url, {
headers: {
'Authorization': `Bearer ${process.env.INVENTORY_API_KEY}`,
'Accept': 'application/json',
},
})
if (!res.ok) {
throw new Error(`Inventory API ${res.status}: ${await res.text()}`)
}
return res.json()
}
const results = await searchInventory({
warehouse: 'eu-west-1',
minStock: 10,
updatedAfter: new Date('2025-01-01'),
})
console.log(`Found ${results.total} items`)POST požadavek — URL-kódování těla formuláře
// application/x-www-form-urlencoded POST — used by OAuth token endpoints,
// legacy form-submission APIs, and some webhook providers
async function requestOAuthToken(
clientId: string,
clientSecret: string,
code: string,
redirectUri: string,
): Promise<{ access_token: string; expires_in: number }> {
const body = new URLSearchParams({
grant_type: 'authorization_code',
client_id: clientId,
client_secret: clientSecret,
code,
redirect_uri: redirectUri, // URLSearchParams encodes this automatically
})
const res = await fetch('https://oauth.provider.com/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: body.toString(),
// body: body — also works directly in modern environments (Fetch spec accepts URLSearchParams)
})
if (!res.ok) {
const err = await res.json()
throw new Error(`OAuth error: ${err.error_description ?? err.error}`)
}
return res.json()
}Pokud potřebujete otestovat nebo ladit zakódovanou URL bez nastavení skriptu, vložte surovou hodnotu přímo do URL Encoder — okamžitě zakóduje a dekóduje a ukáže přesně, co prohlížeč a server uvidí. Užitečné pro kontrolu OAuth přesměrování URI, webhook callback URL a podepsaných CDN parametrů požadavku.
URL kódování příkazovou řádkou s Node.js a Shell
Pro shell skripty, CI pipelines nebo rychlé ladění funguje několik přístupů příkazové řádky bez psaní celého skriptu.
# ── Node.js one-liners — cross-platform (macOS, Linux, Windows) ────────
# encodeURIComponent — encode a single value
node -e "console.log(encodeURIComponent(process.argv[1]))" "Wireless Keyboard & Mouse"
# Wireless%20Keyboard%20%26%20Mouse
# Build a complete query string
node -e "console.log(new URLSearchParams(JSON.parse(process.argv[1])).toString())" '{"q":"standing desk","category":"office-furniture","page":"1"}'
# q=standing+desk&category=office-furniture&page=1
# Decode a percent-encoded string
node -e "console.log(decodeURIComponent(process.argv[1]))" "Wireless%20Keyboard%20%26%20Mouse"
# Wireless Keyboard & Mouse
# ── curl — automatic encoding ───────────────────────────────────────────
# curl --data-urlencode encodes values automatically in GET and POST
curl -G "https://api.example.com/search" --data-urlencode "q=Wireless Keyboard & Mouse" --data-urlencode "category=office furniture"
# ── Python one-liner (available on most systems) ─────────────────────────
python3 -c "from urllib.parse import quote; print(quote(input(), safe=''))"
# (type the string and press Enter)
# ── jq + bash: encode every value in a JSON object ───────────────────────
echo '{"q":"hello world","tag":"node & express"}' | node -e "const d=JSON.parse(require('fs').readFileSync('/dev/stdin','utf8')); console.log(new URLSearchParams(d).toString())"
# q=hello+world&tag=node+%26+expressVýkonná alternativa: qs
Vestavěná URLSearchParams nepodporuje vnořené objekty ani pole — tvar query stringů používaných mnoha API a frameworky. Knihovna qs (30M+ týdenních stažení z npm) zvládá celé spektrum vzorů query stringů vyskytujících se v praxi: vnořené objekty s závorkovým zápisem (filters[status]=active), opakované klíče, vlastní enkodéry a konfigurovatelné formáty serializace polí.
npm install qs # or pnpm add qs
import qs from 'qs'
// URLSearchParams cannot represent this structure natively
const reportFilters = {
dateRange: {
from: '2025-01-01',
to: '2025-03-31',
},
status: ['published', 'archived'],
author: { id: 'usr_4f2a9c1b', role: 'editor' },
workspace: 'ws-platform-eu',
}
// qs produces bracket-notation query strings used by Express, Rails, Django REST
const query = qs.stringify(reportFilters, { encode: true })
console.log(query)
// dateRange%5Bfrom%5D=2025-01-01&dateRange%5Bto%5D=2025-03-31&status%5B0%5D=published&status%5B1%5D=archived&author%5Bid%5D=usr_4f2a9c1b&author%5Brole%5D=editor&workspace=ws-platform-eu
// Human-readable (no encoding) — useful for debugging
console.log(qs.stringify(reportFilters, { encode: false }))
// dateRange[from]=2025-01-01&dateRange[to]=2025-03-31&status[0]=published&status[1]=archived...
// Parsing back
const parsed = qs.parse(query)
console.log(parsed.dateRange) // { from: '2025-01-01', to: '2025-03-31' }
console.log(parsed.status) // ['published', 'archived']Pro ploché páry klíč–hodnota je URLSearchParams vždy správnou volbou — je vestavěná, nemá žádnou režii a je univerzálně podporována. Sáhněte po qs pouze pokud potřebujete vnořené struktury, jiné formáty serializace polí než opakované klíče, nebo integrujete se s backend frameworkem, který očekává query stringy se závorkovým zápisem.
Časté chyby
Tyto čtyři chyby jsem opakovaně vídal v produkčních kódových základnách — většina z nich jsou tiché selhání, která se projeví teprve když hodnota obsahuje speciální znak, což je přesně ten typ chyby, který projde unit testy a objeví se až s reálnými uživatelskými daty.
Chyba 1 — Použití encodeURI() pro hodnoty parametrů dotazu
Problém: encodeURI() nekóduje &, = ani +. Pokud hodnota tyto znaky obsahuje, jsou interpretovány jako syntaxe query stringu a tiše rozdělují nebo přepisují parametry. Řešení: pro jednotlivé hodnoty vždy používejte encodeURIComponent().
// ❌ encodeURI does not encode & and = in the value
// "plan=pro&promo=SAVE20" is treated as two separate params
const planName = 'Pro Plan (save=20% & free trial)'
const url = `/checkout?plan=${encodeURI(planName)}`
// /checkout?plan=Pro%20Plan%20(save=20%%20&%20free%20trial)
// ↑ & breaks the query string// ✅ encodeURIComponent encodes & and = safely
const planName = 'Pro Plan (save=20% & free trial)'
const url = `/checkout?plan=${encodeURIComponent(planName)}`
// /checkout?plan=Pro%20Plan%20(save%3D20%25%20%26%20free%20trial)
// ↑ = and & are both encodedChyba 2 — Dvojité kódování již zakódovaného řetězce
Problém: Volání encodeURIComponent() na hodnotě, která je již percent-zakódována, změní % na %25, takže %20 se stane %2520. Server dekóduje jednou a obdrží doslovné %20 místo mezery. Řešení: nejprve dekódujte, poté znovu zakódujte, nebo zajistěte, aby hodnota nebyla nikdy zakódována dvakrát.
// ❌ encodedParam already contains %20 — encoding again produces %2520
const encodedParam = 'Praha%20Office'
const url = `/api/locations/${encodeURIComponent(encodedParam)}`
// /api/locations/Praha%2520Office
// Server sees: "Praha%20Office" (a literal percent-twenty, not a space)// ✅ Decode first if the value may already be encoded
const maybeEncoded = 'Praha%20Office'
const clean = decodeURIComponent(maybeEncoded) // 'Praha Office'
const url = `/api/locations/${encodeURIComponent(clean)}`
// /api/locations/Praha%20Office — correctChyba 3 — Nezohledňování rozdílu + / %20 mezi URLSearchParams a encodeURIComponent
Problém: URLSearchParams kóduje mezery jako + (application/x-www-form-urlencoded), zatímco encodeURIComponent() používá %20. Míchání obou ve stejné URL — například přidání předem zakódovaného řetězce k výstupu URLSearchParams — produkuje nekonzistentní kódování, které mate některé parsery. Řešení: zvolte jeden přístup a používejte jej konzistentně v celé funkci pro sestavení URL.
// ❌ Mixed: URLSearchParams uses + for spaces, but we're appending
// a manually-encoded segment that uses %20
const base = new URLSearchParams({ category: 'office furniture' })
const extra = `sort=${encodeURIComponent('price asc')}`
const url = `/api/products?${base}&${extra}`
// /api/products?category=office+furniture&sort=price%20asc
// ↑ two different space encodings in the same URL// ✅ Use URLSearchParams exclusively — consistent encoding throughout
const params = new URLSearchParams({
category: 'office furniture',
sort: 'price asc',
})
const url = `/api/products?${params}`
// /api/products?category=office+furniture&sort=price+ascChyba 4 — Zapomenutí zakódovat segmenty cesty obsahující lomítka
Problém: Identifikátor zdroje jako cesta k souboru (reports/2025/q1.pdf) použitý jako segment REST cesty obsahuje znaky /, které router serveru interpretuje jako oddělovače cesty a směruje na neexistující endpoint. Řešení: pro segmenty cesty, které mohou obsahovat lomítka, vždy používejte encodeURIComponent().
// ❌ The file path contains / — the server receives a 3-segment path
// instead of a single resource ID
const filePath = 'reports/2025/q1-financials.pdf'
const url = `https://storage.example.com/objects/${filePath}`
// https://storage.example.com/objects/reports/2025/q1-financials.pdf
// → Server routes to /objects/:year/:filename — 404 or wrong resource// ✅ encodeURIComponent encodes / as %2F — single path segment
const filePath = 'reports/2025/q1-financials.pdf'
const url = `https://storage.example.com/objects/${encodeURIComponent(filePath)}`
// https://storage.example.com/objects/reports%2F2025%2Fq1-financials.pdf
// → Server receives the full file path as one resource identifierMetody URL kódování v JavaScriptu — Rychlé srovnání
| Metoda | Kóduje mezery jako | Kóduje & = ? | Kóduje # / : | Případ použití | Vyžaduje instalaci |
|---|---|---|---|---|---|
| encodeURIComponent() | %20 | ✅ ano | ✅ ano | Kódování jednotlivých hodnot parametrů | No |
| encodeURI() | %20 | ❌ ne | ❌ ne | Sanitace kompletního URL řetězce | No |
| URLSearchParams | + | ✅ ano | ✅ ano | Sestavování a parsování query stringů | No |
| Konstruktor URL | auto dle komponenty | auto | auto | Sestavování a normalizace kompletních URL | No |
| Knihovna qs | %20 (konfigurovatelné) | ✅ ano | ✅ ano | Vnořené objekty a pole v query stringách | npm install qs |
V naprosté většině případů se volba zúží na tři scénáře. Použijte URLSearchParams při sestavování query stringů s více parametry ze strukturovaných dat — je to nejbezpečnější a nejčitelnější možnost. Použijte encodeURIComponent() pro kódování jedné hodnoty v URL s šablonovým literálem, pro segmenty cesty nebo pro hodnoty v systémech, které očekávají %20 místo + pro mezery (jako AWS S3 podepsané URL). Sáhněte po qs pouze pokud váš query string nese vnořené objekty nebo pole, která URLSearchParams nativně nedokáže reprezentovat.
Často kladené otázky
Související nástroje
Pro kódování nebo dekódování jedním kliknutím bez psaní kódu vložte svůj řetězec přímo do URL Encoder — okamžitě zpracuje percent-kódování a dekódování ve vašem prohlížeči, s připraveným zakódovaným výstupem ke zkopírování do volání fetch nebo terminálu.
Alex is a front-end and Node.js developer with extensive experience building web applications and developer tooling. He is passionate about web standards, browser APIs, and the JavaScript ecosystem. In his spare time he contributes to open-source projects and writes about modern JavaScript patterns, performance optimisation, and everything related to the web platform.
Sophie is a full-stack developer focused on TypeScript across the entire stack — from React frontends to Express and Fastify backends. She has a particular interest in type-safe API design, runtime validation, and the patterns that make large JavaScript codebases stay manageable. She writes about TypeScript idioms, Node.js internals, and the ever-evolving JavaScript module ecosystem.