URL Encode JavaScript — encodeURIComponent()
Använd det kostnadsfria URL Encode Online direkt i webbläsaren — ingen installation krävs.
Prova URL Encode Online online →När du bygger en sök-URL, skickar en omdirigeringssökväg som en frågeparameter eller konstruerar en OAuth-auktoriseringsbegäran kommer specialtecken som &, = och mellanslag att tyst förstöra URL:en om du inte URL-kodar dem först. JavaScript erbjuder tre inbyggda metoder — encodeURIComponent(), encodeURI() och URLSearchParams — var och en utformad för ett specifikt användningsfall. Att välja fel är grundorsaken till de flesta kodningsfel jag stött på i kodgranskningar. För snabb engångskodning utan kod hanterar ToolDecks URL Encoder det direkt i webbläsaren. Den här guiden täcker alla tre metoder ingående (JavaScript ES2015+ / Node.js 10+): när man använder var och en, hur de skiljer sig åt för mellanslag och reserverade tecken, verkliga Fetch- och API-mönster, CLI-användning och de fyra misstag som orsakar de flesta subtila produktionsfel.
- ✓encodeURIComponent() är rätt val för att koda individuella parametervärden — det kodar varje tecken utom A–Z, a–z, 0–9 och - _ . ! ~ * ' ( )
- ✓encodeURI() kodar en komplett URL och bevarar strukturella tecken (/ ? # & = :) — använd det aldrig för enskilda värden
- ✓URLSearchParams kodar nyckel-värdepar automatiskt i application/x-www-form-urlencoded-format, där mellanslag blir + istället för %20
- ✓Dubbelkodning är det vanligaste produktionsfelet: encodeURIComponent(encodeURIComponent(value)) förvandlar %20 till %2520
- ✓qs-biblioteket hanterar nästlade objekt och arrayer i querystringar native — URLSearchParams från standardbiblioteket gör det inte
Vad är URL-kodning?
URL-kodning (formellt kallat procentkodning, definierat i RFC 3986) konverterar tecken som inte är tillåtna eller har speciell betydelse i en URL till en säker representation. Varje osäkert byte ersätts med ett procenttecken följt av två hexadecimala siffror — ASCII-koden för tecknet. Ett mellanslag blir %20, ett et-tecken blir %26, ett snedstreck framåt blir %2F.
Tecknen som alltid är säkra och aldrig kodas kallas oreserverade tecken: bokstäverna A–Z och a–z, siffrorna 0–9 och de fyra symbolerna - _ . ~. Allt annat måste antingen kodas när det används som data, eller har en strukturell roll i själva URL:en (som / för att separera sökvägssegment eller &för att separera frågeparametrar). Den praktiska konsekvensen: ett produktnamn som “Wireless Keyboard & Mouse” i en frågeparameter förstör URL-strukturen om det skickas okodad.
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() — Rätt funktion för frågeparametrar
encodeURIComponent() är arbetshästen inom URL-kodning i JavaScript. Den kodar varje tecken utom den oreserverade uppsättningen (A–Z, a–z, 0–9, - _ . ! ~ * ' ( )). Det avgörande är att den kodar alla tecken som har strukturell betydelse i URL:er — &, =, ?, #, / — vilket gör den säker att använda i parameter-värden. Ingen import behövs; det är en global funktion tillgänglig i alla JavaScript-miljöer.
Minimalt fungerande exempel
// 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.99Koda en omdirigerings-URL som en frågeparameter
// 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.internalKoda icke-ASCII- och Unicode-tecken
// encodeURIComponent handles Unicode natively in all modern environments
// Each UTF-8 byte of the character is percent-encoded
const customerName = 'Lindqvist, Erik'
const productTitle = '東京 wireless adapter'
const reviewText = 'Mycket bra — fungerar utmärkt'
console.log(encodeURIComponent(customerName))
// Lindqvist%2C%20Erik
console.log(encodeURIComponent(productTitle))
// %E6%9D%B1%E4%BA%AC%20wireless%20adapter
console.log(encodeURIComponent(reviewText))
// Mycket%20bra%20%E2%80%94%20fungerar%20utm%C3%A4rkt
// Decoding back
console.log(decodeURIComponent('Lindqvist%2C%20Erik'))
// Lindqvist, ErikencodeURIComponent() använder JavaScript-motorns interna UTF-16-teckenkodning och kodar sedan varje UTF-8-byte av tecknet separat. Ett tecken som ü (U+00FC) kodas till %C3%BC eftersom dess UTF-8-representation består av två bytes: 0xC3 och 0xBC. Detta är korrekt och följer URI-standarden — servrar förväntas avkoda UTF-8-bytesekvensen tillbaka till den ursprungliga kodpunkten.JavaScript URL-kodningsfunktioner — Teckensreferens
De tre native kodningsmetoderna skiljer sig i exakt vilka tecken de kodar. Tabellen nedan visar utdata för de vanligaste problematiska tecknen:
| Tecken | Roll i URL | encodeURIComponent() | encodeURI() | URLSearchParams |
|---|---|---|---|---|
| Space | ordseparator | %20 | %20 | + |
| & | parameterseparator | %26 | behålls | %26 |
| = | nyckel=värde | %3D | behålls | %3D |
| + | kodat mellanslag (form) | %2B | %2B | %2B |
| ? | frågestart | %3F | behålls | %3F |
| # | fragment | %23 | behålls | %23 |
| / | sökvägsseparator | %2F | behålls | %2F |
| : | schema / port | %3A | behålls | %3A |
| @ | auth-separator | %40 | behålls | %40 |
| % | procentliteral | %25 | %25 | %25 |
| ~ | oreserverad | behålls | behålls | behålls |
Den kritiska kolumnen är encodeURIComponent() vs encodeURI() för & och =: encodeURI() lämnar dem orörda, vilket är korrekt vid kodning av en fullständig URL men katastrofalt vid kodning av ett värde som innehåller dessa tecken.
encodeURI() — När URL-strukturen ska bevaras
encodeURI() är utformad för att koda en komplett URL— den bevarar alla tecken som är giltiga strukturella delar av en URI: schemat (https://), hosten, sökvägsseparatorer, frågetelimitatorer och fragmentidentifieraren. Använd den när du tar emot en URL som kan innehålla mellanslag eller icke-ASCII-tecken i sökvägssegment, men du behöver hålla dess struktur intakt.
Sanera en användartillhandahållen URL
// 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-konstruktorn är vanligtvis ett bättre val än encodeURI() för att hantera användartillhandahållna URL-strängar — den normaliserar URL:en, validerar strukturen och ger dig ett rent API för att komma åt varje komponent. Reservera encodeURI() för fall där du behöver ett strängresultat och redan vet att inmatningen strukturellt är en giltig URL.URLSearchParams — Den moderna metoden för querystringar
URLSearchParams är det idiomatiska sättet att bygga och tolka querystringar i modernt JavaScript. Den är globalt tillgänglig i alla moderna webbläsare och Node.js 10+, och hanterar kodning automatiskt — du arbetar med enkla nyckel-värdepar och den producerar rätt utdata. En viktig detalj: den följer application/x-www-form-urlencoded-specifikationen, som kodar mellanslag som + snarare än %20. Detta är korrekt och brett stödjat, men du bör vara medveten om det när din server förväntar sig ett specifikt format.
Bygga en sökbegärans-URL
// 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+adjustableTolka en inkommande querystring
// 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']Hur man URL-kodar parametrar i JavaScript Fetch-begäranden
Det vanligaste stället URL-kodning förekommer i produktionskod är i fetch()-anrop — antingen vid byggandet av begärnings-URL:en eller vid sändning av formulärdata i begärandetexten. Varje scenario har sin egen korrekta metod.
GET-begäran — koda frågeparametrar
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-begäran — URL-koda en formulärkropp
// 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()
}När du behöver testa eller felsöka en kodad URL utan att sätta upp ett skript, klistra in råvärdet direkt i URL Encoder — det kodar och avkodar direkt och visar exakt vad webbläsaren och servern kommer att se. Användbart för att inspektera OAuth-omdirigeringss-URI:er, webhook-callback-URL:er och signerade CDN-begäranparametrar.
URL-kodning via kommandoraden med Node.js och Shell
För shell-skript, CI-pipelines eller snabb felsökning fungerar flera kommandoradsmetoder utan att skriva ett fullständigt skript.
# ── 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+expressHögpresterande alternativ: qs
Den inbyggda URLSearchParams stöder inte nästlade objekt eller arrayer — formen på querystringar som används av många API:er och ramverk. Biblioteket qs (30M+ veckliga npm-nedladdningar) hanterar hela spektrumet av querystringmönster som förekommer i verkligheten: nästlade objekt med hakparentesnotation (filters[status]=active), upprepade nycklar, anpassade kodare och konfigurerbara array-serialiseringsformat.
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']För platta nyckel-värdeparametrar är URLSearchParams alltid rätt val — det är inbyggt, har noll overhead och stöds universellt. Ta till qs bara när du behöver nästlade strukturer, andra array-serialiseringsformat än upprepade nycklar, eller när du integrerar med ett backend-ramverk som förväntar sig querystringar med hakparentesnotation.
Vanliga misstag
Jag har sett dessa fyra misstag upprepade gånger i produktionskodsbaser — de flesta är tysta fel som bara dyker upp när ett värde innehåller ett specialtecken, vilket är exakt den typ av fel som slinker igenom enhetstester och bara visar sig med riktiga användardata.
Misstag 1 — Använda encodeURI() för frågeparametervärden
Problem: encodeURI() kodar inte &, = eller +. När ett värde innehåller dessa tecken tolkas de som frågesträngssyntax och delar eller skriver tyst över parametrar. Lösning: använd alltid encodeURIComponent() för enskilda värden.
// ❌ 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 encodedMisstag 2 — Dubbelkoda en redan kodad sträng
Problem: Att anropa encodeURIComponent() på ett värde som redan är procentkodat förvandlar % till %25, så %20 blir %2520. Servern avkodar en gång och tar emot ett bokstavligt %20 istället för ett mellanslag. Lösning: avkoda först, koda sedan om, eller säkerställ att värdet aldrig kodas två gånger.
// ❌ encodedParam already contains %20 — encoding again produces %2520
const encodedParam = 'Stockholm%20Office'
const url = `/api/locations/${encodeURIComponent(encodedParam)}`
// /api/locations/Stockholm%2520Office
// Server sees: "Stockholm%20Office" (a literal percent-twenty, not a space)// ✅ Decode first if the value may already be encoded
const maybeEncoded = 'Stockholm%20Office'
const clean = decodeURIComponent(maybeEncoded) // 'Stockholm Office'
const url = `/api/locations/${encodeURIComponent(clean)}`
// /api/locations/Stockholm%20Office — correctMisstag 3 — Inte ta hänsyn till + / %20-skillnaden mellan URLSearchParams och encodeURIComponent
Problem: URLSearchParams kodar mellanslag som + (application/x-www-form-urlencoded), medan encodeURIComponent() använder %20. Att blanda båda i samma URL — till exempel lägga till en förkodad sträng till en URLSearchParams-utdata — producerar inkonsekvent kodning som förvirrar vissa tolkare. Lösning: välj en metod och använd den konsekvent i en URL-byggfunktion.
// ❌ 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+ascMisstag 4 — Glömma att koda sökvägssegment som innehåller snedstreck
Problem: En resursidentifierare som en filsökväg (reports/2025/q1.pdf) använd som ett REST-sökvägssegment innehåller /-tecken som serverroutern tolkar som sökvägsseparatorer och dirigerar till en icke-existerande slutpunkt. Lösning: använd alltid encodeURIComponent() för sökvägssegment som kan innehålla snedstreck.
// ❌ 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-kodningsmetoder — Snabb jämförelse
| Metod | Kodar mellanslag som | Kodar & = ? | Kodar # / : | Användningsfall | Kräver installation |
|---|---|---|---|---|---|
| encodeURIComponent() | %20 | ✅ ja | ✅ ja | Kodning av enskilda parametervärden | No |
| encodeURI() | %20 | ❌ nej | ❌ nej | Sanering av en komplett URL-sträng | No |
| URLSearchParams | + | ✅ ja | ✅ ja | Bygga och tolka querystringar | No |
| URL-konstruktorn | auto per komponent | auto | auto | Konstruera och normalisera fullständiga URL:er | No |
| qs-biblioteket | %20 (konfigurerbart) | ✅ ja | ✅ ja | Nästlade objekt och arrayer i querystringar | npm install qs |
I de allra flesta fall reduceras valet till tre scenarier. Använd URLSearchParams när du konstruerar multi-parameter querystringar från strukturerad data — det är det säkraste och mest läsbara alternativet. Använd encodeURIComponent() för att koda ett enskilt värde i en mallsträngsliteral-URL, för sökvägssegment eller för värden i system som förväntar sig %20 istället för + för mellanslag (som AWS S3 signerade URL:er). Ta till qs bara när din querystring innehåller nästlade objekt eller arrayer som URLSearchParams inte kan representera nativt.
Vanliga frågor
Relaterade verktyg
För ett-klickskodning eller -avkodning utan att skriva någon kod, klistra in din sträng direkt i URL Encoder — det hanterar procentkodning och -avkodning direkt i din webbläsare, med den kodade utdatan redo att kopiera in i ett fetch-anrop eller 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.