URL Encode JavaScript β encodeURIComponent()
Gebruik de gratis URL Encode Online direct in je browser β geen installatie nodig.
URL Encode Online online uitproberen βWanneer je een zoek-URL bouwt, een omleidingspad doorgeeft als queryparameter of een OAuth-autorisatieverzoek samenstelt, zullen speciale tekens zoals &, = en spaties de URL stil beschadigen tenzij je ze eerst URL-codeert. JavaScript biedt drie ingebouwde benaderingen β encodeURIComponent(), encodeURI() en URLSearchParams β elk ontworpen voor een ander gebruiksscenario. De verkeerde keuze is de hoofdoorzaak van de meeste coderingsfouten die ik in code-reviews ben tegengekomen. Voor snelle eenmalige codering zonder code handelt de URL Encoder van ToolDeck het direct in de browser af. Deze handleiding behandelt alle drie benaderingen uitgebreid (JavaScript ES2015+ / Node.js 10+): wanneer je elke methode gebruikt, hoe ze verschillen voor spaties en gereserveerde tekens, praktische Fetch- en API-patronen, CLI-gebruik en de vier fouten die de meeste subtiele productieproblemen veroorzaken.
- βencodeURIComponent() is de juiste keuze voor het coderen van individuele parameterwaarden β het codeert elk teken behalve AβZ, aβz, 0β9 en - _ . ! ~ * ' ( )
- βencodeURI() codeert een volledige URL en bewaart daarbij structurele tekens (/ ? # & = :) β gebruik het nooit voor individuele waarden
- βURLSearchParams codeert sleutel-waardeparen automatisch in het application/x-www-form-urlencoded-formaat, waarbij spaties + worden in plaats van %20
- βDubbele codering is de meest voorkomende productiefout: encodeURIComponent(encodeURIComponent(value)) verandert %20 in %2520
- βDe qs-bibliotheek verwerkt geneste objecten en arrays in querystrings native β URLSearchParams uit de standaardbibliotheek doet dit niet
Wat is URL-codering?
URL-codering (formeel percent-codering genoemd, gedefinieerd in RFC 3986) converteert tekens die niet toegestaan zijn of een speciale betekenis hebben in een URL naar een veilige representatie. Elk onveilig byte wordt vervangen door een procentteken gevolgd door twee hexadecimale cijfers β de ASCII-code van het teken. Een spatie wordt %20, een ampersand wordt %26, een schuine streep wordt %2F.
De tekens die altijd veilig zijn en nooit gecodeerd worden, heten niet-gereserveerde tekens: letters AβZ en aβz, cijfers 0β9 en de vier symbolen - _ . ~. Al het andere moet gecodeerd worden wanneer het als data wordt gebruikt, of heeft een structurele rol in de URL zelf (zoals / voor het scheiden van padsegmenten of &voor het scheiden van queryparameters). De praktische gevolg: een productnaam als βWireless Keyboard & Mouseβ in een queryparameter vernietigt de URL-structuur als het rauw wordt doorgegeven.
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() β De juiste functie voor queryparameters
encodeURIComponent() is het werkpaard van URL-codering in JavaScript. Het codeert elk teken behalve de niet-gereserveerde set (AβZ, aβz, 0β9, - _ . ! ~ * ' ( )). Cruciaal is dat het alle tekens codeert die een structurele betekenis hebben in URL's β &, =, ?, #, / β wat het veilig maakt voor gebruik in parameter-waarden. Er is geen import nodig; het is een globale functie beschikbaar in alle JavaScript-omgevingen.
Minimaal werkend voorbeeld
// 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.99Een omleidings-URL coderen als queryparameter
// 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.internalNiet-ASCII- en Unicode-tekens coderen
// encodeURIComponent handles Unicode natively in all modern environments
// Each UTF-8 byte of the character is percent-encoded
const customerName = 'de Vries, Lars'
const productTitle = 'ζ±δΊ¬ wireless adapter'
const reviewText = 'Heel goed β werkt perfect'
console.log(encodeURIComponent(customerName))
// de%20Vries%2C%20Lars
console.log(encodeURIComponent(productTitle))
// %E6%9D%B1%E4%BA%AC%20wireless%20adapter
console.log(encodeURIComponent(reviewText))
// Heel%20goed%20%E2%80%94%20werkt%20perfect
// Decoding back
console.log(decodeURIComponent('de%20Vries%2C%20Lars'))
// de Vries, LarsencodeURIComponent() gebruikt de interne UTF-16-tekencodering van de JavaScript-engine en codeert vervolgens elk UTF-8-byte van het teken afzonderlijk. Een teken als ΓΌ (U+00FC) wordt gecodeerd naar %C3%BC omdat de UTF-8-representatie uit twee bytes bestaat: 0xC3 en 0xBC. Dit is correct en volgt de URI-standaard β servers worden verwacht de UTF-8-bytereeks terug te decoderen naar het oorspronkelijke codepunt.JavaScript URL-coderingsfuncties β Tekenreferentie
De drie native coderingsbenaderingen verschillen in precies welke tekens ze coderen. De onderstaande tabel toont de uitvoer voor de meest problematische tekens:
| Teken | Rol in URL | encodeURIComponent() | encodeURI() | URLSearchParams |
|---|---|---|---|---|
| Space | woordscheidingsteken | %20 | %20 | + |
| & | parameterscheidingsteken | %26 | behouden | %26 |
| = | sleutel=waarde | %3D | behouden | %3D |
| + | gecodeerde spatie (form) | %2B | %2B | %2B |
| ? | querybegin | %3F | behouden | %3F |
| # | fragment | %23 | behouden | %23 |
| / | padscheidingsteken | %2F | behouden | %2F |
| : | schema / poort | %3A | behouden | %3A |
| @ | auth-scheidingsteken | %40 | behouden | %40 |
| % | procentliteraal | %25 | %25 | %25 |
| ~ | niet-gereserveerd | behouden | behouden | behouden |
De kritieke kolom is encodeURIComponent() vs. encodeURI() voor & en =: encodeURI() laat ze ongewijzigd, wat correct is bij het coderen van een volledige URL maar catastrofaal bij het coderen van een waardedie deze tekens bevat.
encodeURI() β Wanneer de URL-structuur bewaard moet blijven
encodeURI() is ontworpen voor het coderen van een volledige URLβ het bewaart alle tekens die geldige structurele onderdelen van een URI zijn: het schema (https://), de host, padscheidingstekens, queryscheidingstekens en de fragmentidentificator. Gebruik het wanneer je een URL ontvangt die spaties of niet-ASCII-tekens in padsegmenten kan bevatten, maar waarbij je de structuur intact wilt houden.
Een door de gebruiker opgegeven URL opschonen
// 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-constructor is meestal een betere keuze dan encodeURI() voor het verwerken van door de gebruiker opgegeven URL-strings β het normaliseert de URL, valideert de structuur en geeft je een schone API voor toegang tot elk onderdeel. Reserveer encodeURI() voor gevallen waarbij je een tekenreeksresultaat nodig hebt en al weet dat de invoer structureel een geldige URL is.URLSearchParams β De moderne aanpak voor querystrings
URLSearchParams is de idiomatische manier om querystrings te bouwen en te parsen in modern JavaScript. Het is globaal beschikbaar in alle moderne browsers en Node.js 10+, en verwerkt codering automatisch β je werkt met eenvoudige sleutel-waardeparen en het produceert de juiste uitvoer. Een belangrijk detail: het volgt de application/x-www-form-urlencoded-specificatie, die spaties als + codeert in plaats van %20. Dit is correct en breed ondersteund, maar je moet er rekening mee houden wanneer je server een specifiek formaat verwacht.
Een zoekverzoek-URL bouwen
// 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+adjustableEen inkomende querystring parsen
// 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']URL-parameters coderen in JavaScript Fetch-verzoeken
De meest voorkomende plek waar URL-codering verschijnt in productiecode is binnen fetch()-aanroepen β ofwel bij het bouwen van de verzoek-URL of het verzenden van formulierdata in de verzoektekst. Elk scenario heeft zijn eigen juiste aanpak.
GET-verzoek β queryparameters coderen
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-verzoek β een formuliertekst URL-coderen
// 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()
}Wanneer je een gecodeerde URL wilt testen of debuggen zonder een script op te zetten, plak de ruwe waarde direct in de URL Encoder β het codeert en decodeert direct en toont je precies wat de browser en server zullen zien. Handig voor het inspecteren van OAuth-omleidings-URI's, webhook-callback-URL's en ondertekende CDN-verzoekparameters.
URL-codering via de opdrachtregel met Node.js en Shell
Voor shellscripts, CI-pipelines of snel debuggen werken verschillende opdrachtregelbenaderingen zonder een volledig script te schrijven.
# ββ 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+expressHoogwaardige alternatief: qs
De ingebouwde URLSearchParamsondersteunt geen geneste objecten of arrays β de vorm van querystrings die veel API's en frameworks gebruiken. De qs-bibliotheek (30M+ wekelijkse npm-downloads) verwerkt het volledige scala aan querystring-patronen die in de praktijk voorkomen: geneste objecten met haakjesnotatie (filters[status]=active), herhaalde sleutels, aangepaste encoders en configureerbare array-serialisatieformaten.
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']Voor platte sleutel-waardeparameters is URLSearchParams altijd de juiste keuze β het is ingebouwd, heeft geen overhead en wordt universeel ondersteund. Grijp naar qs alleen wanneer je geneste structuren, andere array-serialisatieformaten dan herhaalde sleutels nodig hebt, of wanneer je integreert met een backend-framework dat querystrings met haakjesnotatie verwacht.
Veelgemaakte fouten
Ik ben deze vier fouten herhaaldelijk tegengekomen in productiecodebasen β de meeste zijn stille fouten die alleen aan de oppervlakte komen wanneer een waarde een speciaal teken bevat, wat precies het soort fout is dat door unit tests glipt en alleen verschijnt met echte gebruikersdata.
Fout 1 β encodeURI() gebruiken voor queryparameterwaarden
Probleem: encodeURI() codeert &, = en + niet. Wanneer een waarde deze tekens bevat, worden ze geΓ―nterpreteerd als querystringsyntaxis en splitsen of overschrijven ze parameters stil. Oplossing: gebruik altijd encodeURIComponent() voor individuele waarden.
// β 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 encodedFout 2 β Een al gecodeerde string dubbel coderen
Probleem: encodeURIComponent() aanroepen op een waarde die al percent-gecodeerd is, verandert het % in %25, waardoor %20 %2520 wordt. De server decodeert eenmaal en ontvangt een letterlijk %20 in plaats van een spatie. Oplossing: eerst decoderen, dan opnieuw coderen, of zorgen dat de waarde nooit tweemaal gecodeerd wordt.
// β encodedParam already contains %20 β encoding again produces %2520
const encodedParam = 'Amsterdam%20Office'
const url = `/api/locations/${encodeURIComponent(encodedParam)}`
// /api/locations/Amsterdam%2520Office
// Server sees: "Amsterdam%20Office" (a literal percent-twenty, not a space)// β
Decode first if the value may already be encoded
const maybeEncoded = 'Amsterdam%20Office'
const clean = decodeURIComponent(maybeEncoded) // 'Amsterdam Office'
const url = `/api/locations/${encodeURIComponent(clean)}`
// /api/locations/Amsterdam%20Office β correctFout 3 β Het + / %20-verschil tussen URLSearchParams en encodeURIComponent niet meenemen
Probleem: URLSearchParams codeert spaties als + (application/x-www-form-urlencoded), terwijl encodeURIComponent() %20 gebruikt. Beide mengen in dezelfde URL β bijvoorbeeld een voorgecodeerde string toevoegen aan een URLSearchParams-uitvoer β produceert inconsistente codering die sommige parsers verwarrend vinden. Oplossing: kies één aanpak en gebruik die consistent in een URL-bouwfunctie.
// β 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+ascFout 4 β Vergeten padsegmenten met schuine strepen te coderen
Probleem: Een resource-identifier zoals een bestandspad (reports/2025/q1.pdf) gebruikt als REST-padsegment bevat /-tekens die de serverrouter interpreteert als padscheidingstekens en doorverwijst naar een niet-bestaand eindpunt. Oplossing: gebruik altijd encodeURIComponent() voor padsegmenten die schuine strepen kunnen bevatten.
// β 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 identifierJavaScript URL-coderingsmethoden β Snelle vergelijking
| Methode | Codeert spaties als | Codeert & = ? | Codeert # / : | Gebruiksscenario | Installatie vereist |
|---|---|---|---|---|---|
| encodeURIComponent() | %20 | β ja | β ja | Coderen van individuele parameterwaarden | No |
| encodeURI() | %20 | β nee | β nee | Opschonen van een volledige URL-string | No |
| URLSearchParams | + | β ja | β ja | Bouwen en parsen van querystrings | No |
| URL-constructor | auto per component | auto | auto | Samenstellen en normaliseren van volledige URL's | No |
| qs-bibliotheek | %20 (configureerbaar) | β ja | β ja | Geneste objecten en arrays in querystrings | npm install qs |
In de overgrote meerderheid van gevallen reduceer je de keuze tot drie scenario's. Gebruik URLSearchParams bij het bouwen van multi-parameter querystrings uit gestructureerde data β dit is de veiligste en meest leesbare optie. Gebruik encodeURIComponent() voor het coderen van een enkele waarde in een template-literal-URL, voor padsegmenten of voor waarden in systemen die %20 verwachten in plaats van + voor spaties (zoals AWS S3 Signed URLs). Grijp naar qs alleen wanneer je querystring geneste objecten of arrays bevat die URLSearchParams niet native kan vertegenwoordigen.
Veelgestelde vragen
Gerelateerde tools
Voor eΓ©n-klik coderen of decoderen zonder code te schrijven, plak je string direct in de URL Encoder β het verwerkt percent-codering en -decodering direct in je browser, met de gecodeerde uitvoer klaar om te kopiΓ«ren in een fetch-aanroep of terminal.
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.