دليل ترميز URL في JavaScript | encodeURIComponent
استخدم مشفّر URL أونلاين المجاني مباشرةً في متصفحك — لا حاجة للتثبيت.
جرّب مشفّر URL أونلاين أونلاين ←عند إنشاء عنوان URL للبحث، أو تمرير مسار إعادة توجيه كمعامل استعلام، أو بناء طلب تفويض OAuth، فإن الأحرف الخاصة مثل & و= والمسافات ستُفسد عنوان URL بصمت إذا لم تُرمِّزها بترميز URL أولاً. يوفر JavaScript ثلاثة مناهج مدمجة—— encodeURIComponent() وencodeURI() وURLSearchParams——كل منها مصمم لحالة استخدام مختلفة، واختيار المنهج الخاطئ هو السبب الجذري لمعظم أخطاء الترميز التي واجهتها في مراجعات الكود. للترميز السريع لمرة واحدة دون كتابة أي كود، مشفّر URL الخاص بـ ToolDeck يعالج ذلك فوراً في المتصفح. يغطي هذا الدليل المناهج الثلاثة بعمق (JavaScript ES2015+ / Node.js 10+): متى تستخدم كلاً منها، كيف تختلف في التعامل مع المسافات والأحرف المحجوزة، أنماط Fetch وAPI الواقعية، استخدام سطر الأوامر، والأخطاء الأربعة التي تسبب أكثر الأخطاء الإنتاجية خفاءً.
- ✓encodeURIComponent() هو الخيار الصحيح لترميز قيم المعاملات الفردية — إذ يُرمِّز كل حرف باستثناء المجموعة غير المحجوزة: A–Z وa–z و0–9 والرموز - _ . ! ~ * ' ( )
- ✓encodeURI() يُرمِّز عنوان URL كاملاً مع الحفاظ على الأحرف الهيكلية (/ ? # & = :) — لا تستخدمه أبداً للقيم الفردية
- ✓URLSearchParams يُرمِّز أزواج المفتاح والقيمة تلقائياً وفق تنسيق application/x-www-form-urlencoded، حيث تصبح المسافات + بدلاً من %20
- ✓الترميز المزدوج هو أكثر أخطاء الإنتاج شيوعاً: encodeURIComponent(encodeURIComponent(value)) يُحوِّل %20 إلى %2520
- ✓مكتبة qs تتعامل مع الكائنات المتداخلة والمصفوفات في سلاسل الاستعلام بشكل أصلي — أما URLSearchParams في المكتبة القياسية فلا تدعم ذلك
ما هو ترميز URL؟
ترميز URL (المعروف رسمياً بترميز النسبة المئوية، المُعرَّف في RFC 3986) يُحوِّل الأحرف غير المسموح بها أو ذات المعنى الخاص في عنوان URL إلى تمثيل آمن. يُستبدل كل بايت غير آمن برمز النسبة المئوية متبوعاً برقمين سداسيين——رمز ASCII للحرف. تصبح المسافة %20 ويصبح الرمز & هو %26 ويصبح الشرطة المائلة هو %2F.
الأحرف الآمنة دائماً والتي لا تُرمَّز أبداً تُسمى الأحرف غير المحجوزة: الأحرف A–Z وa–z، والأرقام 0–9، والرموز الأربعة - _ . ~. كل شيء آخر إما يجب ترميزه عند استخدامه كبيانات، أو له دور هيكلي في عنوان URL نفسه (مثل / الذي يفصل مقاطع المسار و&الذي يفصل معاملات الاستعلام). النتيجة العملية: اسم منتج مثل "لوحة مفاتيح لاسلكية & ماوس" في معامل استعلام يُدمِّر هيكل عنوان URL إذا مُرِّر كما هو.
https://shop.example.com/search?q=Wireless%20Keyboard%20%26%20Mouse&category=peripherals
https://shop.example.com/search?q=Wireless Keyboard & Mouse&category=peripherals
encodeURIComponent() — الدالة الصحيحة لمعاملات الاستعلام
encodeURIComponent() هي الدالة الرئيسية لترميز URL في JavaScript. تُرمِّز كل حرف باستثناء المجموعة غير المحجوزة (A–Z, a–z, 0–9، - _ . ! ~ * ' ( )). والأهم من ذلك أنها تُرمِّز جميع الأحرف ذات المعنى الهيكلي في URLs——& و= و? و# و/—— مما يجعلها آمنة للاستخدام في قيم المعاملات. لا يلزم استيراد؛ فهي دالة عامة متاحة في جميع بيئات JavaScript.
مثال عملي بسيط
// 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ترميز عنوان URL لإعادة التوجيه كمعامل استعلام
// 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ترميز الأحرف غير ASCII وUnicode
// encodeURIComponent handles Unicode natively in all modern environments
// Each UTF-8 byte of the character is percent-encoded
const customerName = 'أحمد العمري'
const productTitle = 'رياض wireless adapter'
const reviewText = 'ممتاز — يعمل بشكل مثالي'
console.log(encodeURIComponent(customerName))
// %D8%A3%D8%AD%D9%85%D8%AF%20%D8%A7%D9%84%D8%B9%D9%85%D8%B1%D9%8A
console.log(encodeURIComponent(productTitle))
// %D8%B1%D9%8A%D8%A7%D8%B6%20wireless%20adapter
console.log(encodeURIComponent(reviewText))
// %D9%85%D9%85%D8%AA%D8%A7%D8%B2%20%E2%80%94%20%D9%8A%D8%B9%D9%85%D9%84%20%D8%A8%D8%B4%D9%83%D9%84%20%D9%85%D8%AB%D8%A7%D9%84%D9%8A
// Decoding back
console.log(decodeURIComponent('%D8%A3%D8%AD%D9%85%D8%AF%20%D8%A7%D9%84%D8%B9%D9%85%D8%B1%D9%8A'))
// أحمد العمريencodeURIComponent() ترميز السلسلة الداخلي UTF-16 لمحرك JavaScript، ثم تُرمِّز كل بايت UTF-8 للحرف بشكل منفصل. يتم ترميز حرف مثل ü (U+00FC) إلى %C3%BC لأن تمثيله بـ UTF-8 هو بايتان: 0xC3 و0xBC. هذا صحيح ويتبع معيار URI — يُتوقَّع من الخوادم فك ترميز تسلسل بايت UTF-8 إلى نقطة الكود الأصلية.دوال ترميز URL في JavaScript — مرجع الأحرف
تختلف مناهج الترميز الأصلية الثلاثة في الأحرف التي تُرمِّزها بالضبط. يوضح الجدول التالي المخرجات للأحرف الأكثر إشكالية:
| الحرف | الدور في URL | encodeURIComponent() | encodeURI() | URLSearchParams |
|---|---|---|---|---|
| Space | فاصل الكلمات | %20 | %20 | + |
| & | فاصل المعاملات | %26 | محفوظ | %26 |
| = | مفتاح=قيمة | %3D | محفوظ | %3D |
| + | مسافة مُرمَّزة (نموذج) | %2B | %2B | %2B |
| ? | بداية الاستعلام | %3F | محفوظ | %3F |
| # | المقطع | %23 | محفوظ | %23 |
| / | فاصل المسار | %2F | محفوظ | %2F |
| : | المخطط / المنفذ | %3A | محفوظ | %3A |
| @ | فاصل المصادقة | %40 | محفوظ | %40 |
| % | رمز النسبة المئوية | %25 | %25 | %25 |
| ~ | غير محجوز | محفوظ | محفوظ | محفوظ |
العمود الحاسم هو مقارنة encodeURIComponent() مع encodeURI() للرمزين & و=:encodeURI() يتركهما دون تغيير، وهو صحيح عند ترميز عنوان URL كامل لكنه كارثي عند ترميز قيمة تحتوي على هذه الأحرف.
encodeURI() — متى تحافظ على هيكل URL
encodeURI() مصمم لترميز عنوان URL كامل—— فهو يحافظ على جميع الأحرف الصالحة كأجزاء هيكلية لـ URI: المخطط (https://)، والمضيف، وفواصل المسار، وفواصل الاستعلام، ومعرف المقطع. استخدمه عندما تتلقى عنوان URL قد يحتوي على مسافات أو أحرف غير ASCII في مقاطع مساره، لكنك تحتاج إلى إبقاء هيكله سليماً.
تنظيف عنوان 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 هو عادةً خيار أفضل من encodeURI() للتعامل مع سلاسل URL المُقدَّمة من المستخدم—— فهو يُوحِّد عنوان URL، ويتحقق من الهيكل، ويمنحك واجهة برمجية نظيفة للوصول إلى كل مكوِّن. احتفظ بـ encodeURI() للحالات التي تحتاج فيها إلى نتيجة سلسلة وتعلم مسبقاً أن المدخل هو عنوان URL صالح هيكلياً.URLSearchParams — المنهج الحديث لسلاسل الاستعلام
URLSearchParams هو الطريقة الاصطلاحية لبناء وتحليل سلاسل الاستعلام في JavaScript الحديث. متاح عالمياً في جميع المتصفحات الحديثة وNode.js 10+، ويتعامل مع الترميز تلقائياً——تعمل مع أزواج مفتاح-قيمة بسيطة وينتج المخرجات الصحيحة. تفصيل مهم: يتبع مواصفة application/x-www-form-urlencoded، التي تُرمِّز المسافات كـ + بدلاً من %20. هذا صحيح ومدعوم على نطاق واسع، لكن عليك الانتباه إليه عندما يتوقع خادمك تنسيقاً محدداً.
بناء عنوان 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+adjustableتحليل سلسلة استعلام واردة
// 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 للمعاملات في طلبات JavaScript Fetch
أكثر المواضع شيوعاً لظهور ترميز URL في كود الإنتاج هو داخل استدعاءات fetch()——سواء عند بناء عنوان URL للطلب أو إرسال بيانات النموذج في جسم الطلب. لكل سيناريو منهجه الصحيح.
طلب GET — ترميز معاملات الاستعلام
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 — ترميز URL لجسم النموذج
// 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()
}عندما تحتاج إلى اختبار أو تصحيح عنوان URL مُرمَّز دون إعداد سكريبت، الصق القيمة الخام مباشرةً في مشفّر URL — فهو يُرمِّز ويفك الترميز فوراً، ويُظهر لك بالضبط ما سيراه المتصفح والخادم. مفيد لفحص عناوين URI لإعادة توجيه OAuth وعناوين URL لاستدعاء Webhook ومعاملات الطلبات الموقَّعة لـ CDN.
ترميز URL من سطر الأوامر باستخدام Node.js والـ Shell
لسكريبتات Shell أو مسارات CI أو التصحيح السريع، تعمل عدة مناهج من سطر الأوامر دون كتابة سكريبت كامل.
# ── 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البديل عالي الأداء: qs
المدمج URLSearchParams لا يدعم الكائنات المتداخلة أو المصفوفات—— وهو شكل سلاسل الاستعلام المستخدمة في كثير من APIs والأطر البرمجية. مكتبة qs (أكثر من 30 مليون تنزيل أسبوعي عبر npm) تتعامل مع النطاق الكامل من أنماط سلاسل الاستعلام المستخدمة في الواقع: الكائنات المتداخلة بترميز الأقواس (filters[status]=active)، والمفاتيح المكررة، والمُرمِّزات المخصصة، وتنسيقات تسلسل المصفوفات القابلة للتهيئة.
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']لمعاملات مفتاح-قيمة المسطحة، URLSearchParams هو دائماً الخيار الصحيح—— فهو مدمج، وعبء حمله صفري، ومدعوم عالمياً. الجأ إلى qs فقط عندما تحتاج إلى هياكل متداخلة، أو تنسيقات تسلسل مصفوفات غير المفاتيح المكررة، أو عند التكامل مع إطار خلفي يتوقع سلاسل استعلام بترميز الأقواس.
الأخطاء الشائعة
رأيت هذه الأخطاء الأربعة مراراً في قواعد الكود الإنتاجية—— معظمها إخفاقات صامتة لا تظهر إلا عندما تحتوي قيمة على حرف خاص، وهو بالضبط النوع من الأخطاء الذي يفلت من اختبارات الوحدة ولا يظهر إلا مع بيانات المستخدم الحقيقية.
الخطأ الأول — استخدام encodeURI() لقيم معاملات الاستعلام
المشكلة: encodeURI() لا يُرمِّز & أو = أو +. عندما تحتوي قيمة على هذه الأحرف، تُفسَّر كبنية سلسلة استعلام، وتُقسِّم المعاملات أو تستبدلها بصمت. الحل: استخدم دائماً encodeURIComponent() للقيم الفردية.
// ✅ 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// ❌ 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() على قيمة مُرمَّزة بالنسبة المئوية مسبقاً يُحوِّل % إلى %25، فيتحول %20 إلى %2520. يفك الخادم الترميز مرة واحدة ويتلقى %20 حرفياً بدلاً من مسافة. الحل: افك الترميز أولاً ثم أعد الترميز، أو تأكد من عدم ترميز القيمة مرتين.
// ✅ 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 — correct// ❌ 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)الخطأ الثالث — عدم مراعاة الفرق بين + و%20 في URLSearchParams وencodeURIComponent
المشكلة: URLSearchParams يُرمِّز المسافات كـ + (application/x-www-form-urlencoded)، بينما يستخدم encodeURIComponent() %20. الخلط بين الاثنين في نفس عنوان URL——على سبيل المثال، إلحاق سلسلة مُرمَّزة مسبقاً بمخرجات URLSearchParams—— ينتج ترميزاً غير متسق يُربك بعض المحللين. الحل: اختر منهجاً واحداً واستخدمه بشكل متسق في جميع أنحاء دالة بناء 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// ❌ 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الخطأ الرابع — نسيان ترميز مقاطع المسار التي تحتوي على شرطات مائلة
المشكلة: معرِّف مورد مثل مسار ملف (reports/2025/q1.pdf) مستخدم كمقطع مسار REST يحتوي على أحرف / يُفسِّرها راوتر الخادم كفواصل مسار، فيوجِّه إلى نقطة نهاية غير موجودة. الحل: استخدم دائماً encodeURIComponent() لمقاطع المسار التي قد تحتوي على شرطات مائلة.
// ✅ 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// ❌ 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أساليب ترميز URL في JavaScript — مقارنة سريعة
| الأسلوب | ترميز المسافات | يُرمِّز & = ? | يُرمِّز # / : | حالة الاستخدام | يتطلب تثبيتاً |
|---|---|---|---|---|---|
| encodeURIComponent() | %20 | ✅ نعم | ✅ نعم | ترميز قيم المعاملات الفردية | No |
| encodeURI() | %20 | ❌ لا | ❌ لا | تنظيف سلسلة URL كاملة | No |
| URLSearchParams | + | ✅ نعم | ✅ نعم | بناء وتحليل سلاسل الاستعلام | No |
| URL constructor | تلقائي حسب المكوِّن | تلقائي | تلقائي | بناء وتوحيد عناوين URL الكاملة | No |
| qs library | %20 (قابل للتهيئة) | ✅ نعم | ✅ نعم | الكائنات والمصفوفات المتداخلة في سلاسل الاستعلام | npm install qs |
في الغالبية العظمى من الحالات، يتلخص الاختيار في ثلاثة سيناريوهات. استخدم URLSearchParams عند بناء سلاسل استعلام متعددة المعاملات من بيانات منظَّمة——فهو الخيار الأكثر أماناً وقابلية للقراءة. استخدم encodeURIComponent() لترميز قيمة واحدة في URL قالب نصي، لمقاطع المسار، أو للقيم في الأنظمة التي تتوقع %20 بدلاً من + للمسافات (مثل عناوين AWS S3 الموقَّعة). الجأ إلى qs فقط عندما تحمل سلسلة الاستعلام كائنات متداخلة أو مصفوفات لا يستطيع URLSearchParams تمثيلها بشكل أصلي.
الأسئلة المتكررة
الأدوات ذات الصلة
لترميز أو فك ترميز بنقرة واحدة دون كتابة أي كود، الصق السلسلة مباشرةً في مشفّر URL — فهو يتعامل مع الترميز بالنسبة المئوية وفك الترميز فوراً في متصفحك، والمخرجات المُرمَّزة جاهزة للنسخ في استدعاء fetch أو الطرفية.
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.