URL Encode JavaScript — encodeURIComponent()
Sử dụng Mã hóa URL Trực tuyến miễn phí trực tiếp trên trình duyệt — không cần cài đặt.
Dùng thử Mã hóa URL Trực tuyến trực tuyến →Khi bạn xây dựng một URL tìm kiếm, truyền một đường dẫn chuyển hướng dưới dạng tham số query, hoặc tạo một yêu cầu ủy quyền OAuth, các ký tự đặc biệt như &, = và khoảng trắng sẽ làm hỏng URL một cách thầm lặng nếu bạn không mã hóa URL trước. JavaScript cung cấp ba cách tiếp cận tích hợp — encodeURIComponent(), encodeURI() và URLSearchParams — mỗi cái được thiết kế cho một trường hợp sử dụng khác nhau, và việc chọn sai là nguyên nhân gốc rễ của hầu hết các lỗi mã hóa tôi gặp trong các lần xem xét mã. Để mã hóa nhanh mà không cần viết code, Bộ mã hóa URL của ToolDeck xử lý ngay lập tức trên trình duyệt. Hướng dẫn này bao gồm cả ba cách tiếp cận một cách chi tiết (JavaScript ES2015+ / Node.js 10+): khi nào dùng từng cái, sự khác biệt đối với khoảng trắng và ký tự đặc biệt, các mẫu Fetch và API thực tế, cách dùng CLI, và bốn lỗi gây ra các bug sản xuất tinh vi nhất.
- ✓encodeURIComponent() là lựa chọn đúng để mã hóa từng giá trị tham số riêng lẻ — nó mã hóa mọi ký tự trừ A–Z, a–z, 0–9 và - _ . ! ~ * ' ( )
- ✓encodeURI() mã hóa một URL hoàn chỉnh trong khi giữ nguyên các ký tự cấu trúc (/ ? # & = :) — không bao giờ dùng nó cho các giá trị riêng lẻ
- ✓URLSearchParams tự động mã hóa các cặp khóa-giá trị theo định dạng application/x-www-form-urlencoded, trong đó khoảng trắng thành + thay vì %20
- ✓Double-encoding là lỗi sản xuất phổ biến nhất: encodeURIComponent(encodeURIComponent(value)) biến %20 thành %2520
- ✓Thư viện qs xử lý các đối tượng lồng nhau và mảng trong query string một cách tự nhiên — URLSearchParams tiêu chuẩn không hỗ trợ điều này
URL Encoding là gì?
URL encoding (chính thức được gọi là percent-encoding, được định nghĩa trong RFC 3986) chuyển đổi các ký tự không được phép hoặc có ý nghĩa đặc biệt trong URL thành biểu diễn an toàn. Mỗi byte không an toàn được thay thế bằng dấu phần trăm theo sau là hai chữ số thập lục phân — mã ASCII của ký tự đó. Khoảng trắng trở thành %20, dấu và trở thành %26, dấu gạch chéo trở thành %2F.
Các ký tự luôn an toàn và không bao giờ được mã hóa được gọi là ký tự không dành riêng: chữ cái A–Z và a–z, chữ số 0–9, và bốn ký hiệu - _ . ~. Tất cả những thứ khác hoặc phải được mã hóa khi dùng làm dữ liệu, hoặc có vai trò cấu trúc trong URL (như / phân tách các đoạn đường dẫn hoặc &phân tách các tham số query). Hệ quả thực tế: một tên sản phẩm như “Keyboard & Chuột Không Dây” trong một tham số query sẽ phá hủy cấu trúc URL nếu được truyền thô.
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() — Hàm Đúng cho Tham Số Query
encodeURIComponent() là công cụ chính của URL encoding trong JavaScript. Nó mã hóa mọi ký tự ngoại trừ tập không dành riêng (A–Z, a–z, 0–9, - _ . ! ~ * ' ( )). Quan trọng là, nó mã hóa tất cả các ký tự có ý nghĩa cấu trúc trong URL — &, =, ?, #, / — điều này làm cho nó an toàn để dùng trong giá trị tham số. Không cần import; đây là hàm toàn cục có trong mọi môi trường JavaScript.
Ví dụ tối giản hoạt động được
// 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.99Mã hóa URL chuyển hướng làm tham số query
// 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.internalMã hóa ký tự non-ASCII và Unicode
// encodeURIComponent handles Unicode natively in all modern environments
// Each UTF-8 byte of the character is percent-encoded
const customerName = 'Nguyễn, Văn An'
const productTitle = '東京 wireless adapter'
const reviewText = 'Rất tốt — hoạt động hoàn hảo'
console.log(encodeURIComponent(customerName))
// Nguy%E1%BB%85n%2C%20V%C4%83n%20An
console.log(encodeURIComponent(productTitle))
// %E6%9D%B1%E4%BA%AC%20wireless%20adapter
console.log(encodeURIComponent(reviewText))
// R%E1%BA%A5t%20t%E1%BB%91t%20%E2%80%94%20ho%E1%BA%A1t%20%C4%91%E1%BB%99ng%20ho%C3%A0n%20h%E1%BA%A3o
// Decoding back
console.log(decodeURIComponent('Nguy%E1%BB%85n%2C%20V%C4%83n%20An'))
// Nguyễn, Văn AnencodeURIComponent() sử dụng mã hóa chuỗi UTF-16 nội bộ của JavaScript engine, sau đó mã hóa từng byte UTF-8 của ký tự riêng biệt. Một ký tự như ü (U+00FC) mã hóa thành %C3%BC vì biểu diễn UTF-8 của nó là hai byte: 0xC3 và 0xBC. Đây là đúng và tuân theo tiêu chuẩn URI — máy chủ được kỳ vọng sẽ giải mã chuỗi byte UTF-8 trở lại thành codepoint gốc.Các Hàm URL Encoding JavaScript — Tham Chiếu Ký Tự
Ba cách mã hóa native khác nhau ở chỗ chúng mã hóa những ký tự nào. Bảng dưới đây cho thấy đầu ra cho các ký tự thường gây vấn đề nhất:
| Ký tự | Vai trò trong URL | encodeURIComponent() | encodeURI() | URLSearchParams |
|---|---|---|---|---|
| Khoảng trắng | phân tách từ | %20 | %20 | + |
| & | phân tách tham số | %26 | giữ nguyên | %26 |
| = | khóa=giá trị | %3D | giữ nguyên | %3D |
| + | khoảng trắng mã hóa (form) | %2B | %2B | %2B |
| ? | bắt đầu query | %3F | giữ nguyên | %3F |
| # | fragment | %23 | giữ nguyên | %23 |
| / | phân tách đường dẫn | %2F | giữ nguyên | %2F |
| : | scheme / port | %3A | giữ nguyên | %3A |
| @ | phân tách auth | %40 | giữ nguyên | %40 |
| % | ký tự phần trăm | %25 | %25 | %25 |
| ~ | không dành riêng | giữ nguyên | giữ nguyên | giữ nguyên |
Cột quan trọng là encodeURIComponent() so với encodeURI() đối với & và =: encodeURI() để chúng không thay đổi, điều này đúng khi mã hóa một URL đầy đủ nhưng thảm khốc khi mã hóa một giá trị chứa các ký tự này.
encodeURI() — Khi Nào Giữ Nguyên Cấu Trúc URL
encodeURI() được thiết kế để mã hóa một URL hoàn chỉnh— nó giữ nguyên tất cả các ký tự là bộ phận cấu trúc hợp lệ của URI: scheme (https://), host, dấu phân tách đường dẫn, dấu phân tách query, và định danh fragment. Dùng khi bạn nhận được URL có thể chứa khoảng trắng hoặc ký tự non-ASCII trong các đoạn đường dẫn, nhưng bạn cần giữ nguyên cấu trúc của nó.
Làm sạch URL do người dùng cung cấp
// 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 thường là lựa chọn tốt hơn encodeURI() để xử lý các chuỗi URL do người dùng cung cấp — nó chuẩn hóa URL, xác nhận cấu trúc, và cung cấp API rõ ràng để truy cập từng thành phần. Dành encodeURI() cho các trường hợp bạn cần kết quả là chuỗi và đã biết đầu vào về mặt cấu trúc là một URL hợp lệ.URLSearchParams — Cách Tiếp Cận Hiện Đại cho Query Strings
URLSearchParams là cách thành ngữ để xây dựng và phân tích query strings trong JavaScript hiện đại. Nó có sẵn toàn cục trong tất cả các trình duyệt hiện đại và Node.js 10+, và xử lý mã hóa tự động — bạn làm việc với các cặp khóa-giá trị đơn giản và nó tạo ra đầu ra đúng. Một chi tiết quan trọng: nó tuân theo đặc tả application/x-www-form-urlencoded, mã hóa khoảng trắng thành + thay vì %20. Điều này đúng và được hỗ trợ rộng rãi, nhưng bạn nên biết điều này khi máy chủ của bạn mong đợi một định dạng cụ thể.
Xây dựng URL yêu cầu tìm kiếm
// 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+adjustablePhân tích query string đến
// 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']Cách Mã Hóa Tham Số URL trong Yêu Cầu Fetch JavaScript
Nơi phổ biến nhất URL encoding xuất hiện trong code sản xuất là bên trong các lời gọi fetch() — hoặc là xây dựng URL yêu cầu hoặc gửi dữ liệu form trong phần thân yêu cầu. Mỗi kịch bản có cách tiếp cận đúng riêng của nó.
Yêu cầu GET — mã hóa tham số query
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`)Yêu cầu POST — mã hóa URL phần thân form
// 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()
}Khi bạn cần test hoặc debug một URL đã được mã hóa mà không cần thiết lập script, hãy dán giá trị thô trực tiếp vào Bộ mã hóa URL — nó mã hóa và giải mã ngay lập tức, cho bạn thấy chính xác những gì trình duyệt và máy chủ sẽ thấy. Hữu ích để kiểm tra OAuth redirect URI, URL callback webhook, và tham số yêu cầu đã ký CDN.
Mã Hóa URL Qua Dòng Lệnh với Node.js và Shell
Đối với các shell script, pipeline CI, hoặc debug nhanh, một số cách tiếp cận dòng lệnh hoạt động mà không cần viết script đầy đủ.
# ── 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+expressGiải Pháp Thay Thế Hiệu Suất Cao: qs
URLSearchParams tích hợp không hỗ trợ các đối tượng lồng nhau hoặc mảng — hình dạng của query strings được sử dụng bởi nhiều API và framework. Thư viện qs (30M+ lượt tải npm hàng tuần) xử lý toàn bộ dải các mẫu query string được sử dụng thực tế: đối tượng lồng nhau với ký hiệu ngoặc (filters[status]=active), khóa lặp lại, encoder tùy chỉnh, và các định dạng tuần tự hóa mảng có thể cấu hình.
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']Đối với các tham số khóa-giá trị phẳng, URLSearchParams luôn là lựa chọn đúng — nó được tích hợp sẵn, không có overhead, và được hỗ trợ toàn cầu. Dùng qs chỉ khi bạn cần cấu trúc lồng nhau, các định dạng tuần tự hóa mảng khác ngoài khóa lặp lại, hoặc bạn đang tích hợp với một framework back-end mong đợi query strings có ký hiệu ngoặc.
Các Lỗi Thường Gặp
Tôi đã thấy bốn lỗi này nhiều lần trong các codebase sản xuất — hầu hết là các thất bại thầm lặng chỉ xuất hiện khi một giá trị chứa ký tự đặc biệt, đây chính xác là loại bug lọt qua unit test và chỉ xuất hiện với dữ liệu người dùng thực.
Lỗi 1 — Dùng encodeURI() cho giá trị tham số query
Vấn đề: encodeURI() không mã hóa &, =, hoặc +. Khi một giá trị chứa các ký tự này, chúng được diễn giải là cú pháp query string, âm thầm tách hoặc ghi đè các tham số. Cách sửa: luôn dùng encodeURIComponent() cho các giá trị riêng lẻ.
// ❌ 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 encodedLỗi 2 — Double-encoding một chuỗi đã được mã hóa
Vấn đề: Gọi encodeURIComponent() trên một giá trị đã được percent-encoded sẽ biến % thành %25, vì vậy %20 trở thành %2520. Máy chủ giải mã một lần và nhận được literal %20 thay vì khoảng trắng. Cách sửa: giải mã trước, sau đó mã hóa lại, hoặc đảm bảo giá trị không bao giờ được mã hóa hai lần.
// ❌ encodedParam already contains %20 — encoding again produces %2520
const encodedParam = 'Berlin%20Office'
const url = `/api/locations/${encodeURIComponent(encodedParam)}`
// /api/locations/Berlin%2520Office
// Server sees: "Berlin%20Office" (a literal percent-twenty, not a space)// ✅ Decode first if the value may already be encoded
const maybeEncoded = 'Berlin%20Office'
const clean = decodeURIComponent(maybeEncoded) // 'Berlin Office'
const url = `/api/locations/${encodeURIComponent(clean)}`
// /api/locations/Berlin%20Office — correctLỗi 3 — Không tính đến sự khác biệt + / %20 giữa URLSearchParams và encodeURIComponent
Vấn đề: URLSearchParams mã hóa khoảng trắng thành + (application/x-www-form-urlencoded), trong khi encodeURIComponent() dùng %20. Trộn cả hai trong cùng một URL — ví dụ, thêm một chuỗi đã được mã hóa sẵn vào đầu ra URLSearchParams — tạo ra mã hóa không nhất quán làm nhầm lẫn một số parser. Cách sửa: chọn một cách tiếp cận và dùng nhất quán trong toàn bộ hàm xây dựng 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+ascLỗi 4 — Quên mã hóa các đoạn đường dẫn chứa dấu gạch chéo
Vấn đề: Một định danh tài nguyên như đường dẫn file (reports/2025/q1.pdf) được dùng làm đoạn đường dẫn REST chứa các ký tự / mà router máy chủ diễn giải là dấu phân tách đường dẫn, dẫn đến endpoint không tồn tại. Cách sửa: luôn dùng encodeURIComponent() cho các đoạn đường dẫn có thể chứa dấu gạch chéo.
// ❌ 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 identifierCác Phương Thức URL Encoding JavaScript — So Sánh Nhanh
| Phương thức | Mã hóa khoảng trắng thành | Mã hóa & = ? | Mã hóa # / : | Trường hợp sử dụng | Cần cài đặt |
|---|---|---|---|---|---|
| encodeURIComponent() | %20 | ✅ có | ✅ có | Mã hóa từng giá trị tham số riêng lẻ | No |
| encodeURI() | %20 | ❌ không | ❌ không | Làm sạch một chuỗi URL đầy đủ | No |
| URLSearchParams | + | ✅ có | ✅ có | Xây dựng và phân tích query strings | No |
| Hàm khởi tạo URL | tự động theo thành phần | tự động | tự động | Xây dựng và chuẩn hóa URL đầy đủ | No |
| Thư viện qs | %20 (có thể cấu hình) | ✅ có | ✅ có | Đối tượng lồng nhau và mảng trong query strings | npm install qs |
Đối với phần lớn các trường hợp, sự lựa chọn rút gọn thành ba kịch bản. Dùng URLSearchParams khi xây dựng query strings nhiều tham số từ dữ liệu có cấu trúc — đây là tùy chọn an toàn và dễ đọc nhất. Dùng encodeURIComponent() để mã hóa một giá trị đơn trong URL template literal, cho các đoạn đường dẫn, hoặc cho các giá trị trong các hệ thống mong đợi %20 thay vì + cho khoảng trắng (như AWS S3 signed URLs). Dùng qs chỉ khi query string của bạn mang các đối tượng lồng nhau hoặc mảng mà URLSearchParams không thể biểu diễn tự nhiên.
Các Câu Hỏi Thường Gặp
Công Cụ Liên Quan
Để mã hóa hoặc giải mã chỉ với một cú nhấp mà không cần viết code, hãy dán chuỗi của bạn trực tiếp vào Bộ mã hóa URL — nó xử lý percent-encoding và giải mã ngay lập tức trong trình duyệt của bạn, với đầu ra đã được mã hóa sẵn sàng để sao chép vào lệnh fetch hoặc 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.