URL Encode JavaScript — encodeURIComponent()

·Front-end & Node.js Developer·ZkontrolovánoSophie Laurent·Publikováno

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ý.

Before · text
After · text
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

JavaScript (browser / Node.js)
// 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.99

Kódování přesměrovací URL jako parametru dotazu

JavaScript
// 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.internal

Kódování znaků mimo ASCII a Unicode

JavaScript
// 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áš
Poznámka: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:

ZnakRole v URLencodeURIComponent()encodeURI()URLSearchParams
Spaceoddělovač slov%20%20+
&oddělovač parametrů%26zachováno%26
=klíč=hodnota%3Dzachováno%3D
+kódovaná mezera (form)%2B%2B%2B
?začátek dotazu%3Fzachováno%3F
#fragment%23zachováno%23
/oddělovač cesty%2Fzachováno%2F
:schéma / port%3Azachováno%3A
@oddělovač auth%40zachováno%40
%literál procenta%25%25%25
~nerezervovanýzachovánozachovánozachová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

JavaScript
// 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
Poznámka:Konstruktor 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

JavaScript (browser / Node.js 10+)
// 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+adjustable

Parsování příchozího query stringu

JavaScript
// 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

JavaScript (browser / Node.js 18+)
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

JavaScript
// 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.

bash
# ── 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+express

Vý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í.

bash
npm install qs
# or
pnpm add qs
JavaScript
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().

Before · JavaScript
After · JavaScript
// ❌ 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 encoded

Chyba 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.

Before · JavaScript
After · JavaScript
// ❌ 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 — correct

Chyba 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.

Before · JavaScript
After · JavaScript
// ❌ 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+asc

Chyba 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().

Before · JavaScript
After · JavaScript
// ❌ 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 identifier

Metody URL kódování v JavaScriptu — Rychlé srovnání

MetodaKóduje mezery jakoKóduje & = ?Kóduje # / :Případ použitíVyžaduje instalaci
encodeURIComponent()%20✅ ano✅ anoKódování jednotlivých hodnot parametrůNo
encodeURI()%20❌ ne❌ neSanitace kompletního URL řetězceNo
URLSearchParams+✅ ano✅ anoSestavování a parsování query stringůNo
Konstruktor URLauto dle komponentyautoautoSestavování a normalizace kompletních URLNo
Knihovna qs%20 (konfigurovatelné)✅ ano✅ anoVnořené objekty a pole v query stringáchnpm 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

Jaký je rozdíl mezi encodeURIComponent() a encodeURI() v JavaScriptu?
encodeURIComponent() kóduje každý znak kromě nerezervované sady (A–Z, a–z, 0–9, - _ . ! ~ * ' ( )), včetně strukturálních znaků jako & = ? # / :. Je navržena pro kódování jednotlivých hodnot parametrů dotazu nebo segmentů cesty. encodeURI() zachovává strukturální znaky URL — nekóduje & = ? # / : @ — protože je navržena pro sanitaci kompletní URL bez narušení její struktury. Použití encodeURI() na hodnotě, která obsahuje & nebo =, je běžným zdrojem tiché korupce dat.
Proč URLSearchParams kóduje mezery jako + místo %20?
URLSearchParams sleduje specifikaci application/x-www-form-urlencoded (původně odvozenou z odesílání HTML formulářů), která kóduje mezery jako + spíše než %20. Jak +, tak %20 jsou platné reprezentace mezery v query stringách a většina serverů přijímá obě. Nicméně některá API — zvláště AWS Signature v4, Google API a vlastní REST backendy — vyžadují %20. Pro tyto případy použijte encodeURIComponent() pro ruční sestavení query stringu, nebo zavolejte params.toString().replace(/\+/g, '%20') na výstupu URLSearchParams.
Jak v JavaScriptu URL-zakóduji segment cesty obsahující lomítka?
Použijte encodeURIComponent() — kóduje / jako %2F a celou cestu tak promění v jeden segment. encodeURI() nekóduje /, takže by byl routerem zpracován jako skutečný oddělovač cesty. To je důležité pro REST API, která používají identifikátory zdrojů v pozici cesty: cesty k souborům (reports/2025/q1.pdf), klíče objektů S3 a složené ID (org/team/member). Po zakódování: encodeURIComponent('reports/2025/q1.pdf') → 'reports%2F2025%2Fq1.pdf'.
Jak v JavaScriptu dekóduji percent-zakódovaný parametr URL?
Použijte decodeURIComponent() pro jednotlivé hodnoty parametrů, nebo nechte URLSearchParams to zpracovat automaticky. Když provádíte new URLSearchParams(window.location.search).get('key'), hodnota je již dekódována — nemusíte na ni volat decodeURIComponent() znovu. Volejte decodeURIComponent() přímo pouze pokud obdržíte surový zakódovaný řetězec mimo URLSearchParams, například z vlastní hlavičky nebo z fragmentu URL parsovaného ručně. Poznámka: decodeURIComponent() vyhodí URIError na nesprávně formátovaných sekvencích jako holý znak % — zabalte jej do try/catch, pokud vstup pochází z uživatelských dat.
Mohu použít URLSearchParams ke kódování vnořených objektů jako { filters: { status: "active" } }?
Ne. URLSearchParams podporuje pouze ploché páry klíč–hodnota. Vnořený objekt serializuje voláním .toString() na každé hodnotě, což produkuje "[object Object]" — tiše chybně. Pro vnořené struktury použijte knihovnu qs: qs.stringify({ filters: { status: 'active' } }) produkuje filters%5Bstatus%5D=active (závoKový zápis), jemuž rozumí Express, Rails a Django REST Framework. Alternativně serializujte vnořená data jako JSON řetězec a předejte je jako jednu hodnotu parametru: params.set('filters', JSON.stringify({ status: 'active' })).
Kóduje Fetch API parametry dotazu URL automaticky?
Ne. fetch() přijímá URL řetězec a předává jej doslova síťové vrstvě — neparstuje ani nekóduje parametry dotazu. Pokud zřetězíte nezakódované hodnoty do URL řetězce, speciální znaky požadavek poškodí. Správný vzor je sestavit URL pomocí URLSearchParams nebo encodeURIComponent() před předáním do fetch(): const url = new URL('/api/search', base); url.searchParams.set('q', userInput); const res = await fetch(url). Konstruktor URL a URLSearchParams společně vám poskytují bezpečné automatické kódování s čistým API.

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.

AC
Alex ChenFront-end & Node.js Developer

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.

SL
Sophie LaurentTechnický recenzent

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.