تقنية

علامة الجمع في URLSearchParams: متى تتحول إلى مسافة؟

ثلاثة مسارات اختبرناها للاسم Q+R 8؛ مدخل النص وحده أعاد Q R 8.
مخرجات محلية للاسم المؤلف نفسه؛ نعرض القيمة المقروءة تحت كل مدخل.

تتحول علامة الجمع إلى مسافة عند تحليل نص استعلام بواسطة URLSearchParams. أما عند تقديم قيمة خام عبر append()، فتبقى العلامة جزءا من القيمة. [1] [2]

الخلاصة السريعة

  • مدخل المنشئ النصي يفك ترميز الاستعلام ويقرأ الجمع مسافة. [1]
  • مرر القيمة الخام إلى append() عند بناء المعامل. [2]
  • في تجربتنا حافظ مسار الإضافة على Q+R 8 بعد إعادة القراءة.
  • صياغتان مختلفتان للاستعلام أعادتا القيمة نفسها؛ احتفظ بالأصل إن أردت فحص كتابته.

اختر مدخل المنشئ بحسب ما تملك

يقبل المنشئ نص استعلام أو أزواج أسماء وقيم. المدخل النصي وحده يجري فك ترميز النسبة المئوية وتحويل الجمع إلى مسافة. [1]

صنعنا اسما تدريبيا هو Q+R 8. يحتوي على علامة جمع بين الحرفين، ومسافة واحدة قبل الرقم. هدفنا استعادته بهذه المحارف نفسها بعد بناء معامل اسمه note؛ لا يشير الاسم إلى ملف أو منتج حقيقي.

نفذنا الاختبار محليا في Node.js 24.19.0 وEdge 155.0.4283.45، دون إرسال نموذج أو طلب إلى خادم. قارنا كل قيمة مستعادة بالنص الأصلي، ثم احتفظنا بصيغة الاستعلام التي أعادتها كل طريقة.

ثلاثة مسارات لاسم واحد

في المسار النصي جمعنا اسم المعامل والقيمة فحصلنا على note=Q+R 8. بعد إنشاء الكائن وقراءة note ظهر Q R 8: اختفت علامة الجمع، وصار مكانها فراغ. المسافة التي كانت قبل الرقم بقيت أيضا؛ لذلك لم يعد النص المستعاد مطابقا للاسم الذي بدأنا به.

في المسار الثاني أنشأنا كائنا فارغا، ثم أضفنا الاسم والقيمة منفصلين. بقي الناتج Q+R 8. وفي الثالث قدمنا زوجا يحتوي note والاسم التدريبي، فحصلنا على النتيجة نفسها. الجدول يسجل ما نفذناه بهذه المدخلات المحددة.

لا تختبر النجاح بمجرد وجود note في الناتج. كان المعامل موجودا في المسارات الثلاثة، ومع ذلك اختلفت قيمته في أحدها. ضع الاسم الأصلي إلى جانب المستعاد، ثم افحص موضع الجمع والفراغ قبل الانتقال إلى أي استعمال آخر.

مدخل التجربةالقيمة المقروءةصيغة الاستعلام
نص مركبQ R 8note=Q+R+8
إضافة قيمة خامQ+R 8note=Q%2BR+8
زوج اسم وقيمةQ+R 8note=Q%2BR+8

قارن القيمة المستعادة بالاستعلام المكتوب

تستقبل append() قيما غير مرمزة. وعند تحويل الكائن إلى استعلام، تمثل المسافة بعلامة جمع وتُرمّز علامة الجمع الحرفية؛ اختلاف الكتابة لا يقتضي اختلاف القيمة المستعادة. [2]

أعطانا مسار الإضافة note=Q%2BR+8. هنا بقيت علامة الجمع في الاسم بعد إعادة القراءة، مع أن الاستعلام يعرضها في صورة %2B. أما علامة الجمع الظاهرة قبل الرقم في الاستعلام فصارت المسافة الأصلية في القيمة. جربنا كذلك إدخال هذه الصيغة المكتوبة مباشرة إلى المنشئ، فاستعدنا الاسم نفسه.

الكود التالي يعرض مسار الإضافة الذي نفذناه. يطبع أولا صيغة الاستعلام، ثم القيمة المستعادة، ثم نتيجة مقارنتها بالأصل. كانت النتيجة true في البيئتين المذكورتين؛ النص الأصلي لم يتغير. يحتفظ المتغير query بالتمثيل المكتوب، ويحتفظ restored بما قرأناه منه.

const raw = "Q+R 8";
const p = new URLSearchParams();
p.append("note", raw);
const query = p.toString();
const restored =
  new URLSearchParams(query)
    .get("note");
console.log(query, restored, restored === raw);

[1] [2]

لماذا لا يكفي الناتج لاستعادة الكتابة الأصلية؟

في اختبار منفصل بدأنا بنصين: note=Q+R+8 وnote=Q%20R%208. أعاد كلاهما القيمة Q R 8، ثم أنتجا note=Q+R+8 عند تحويل الكائن إلى نص. سجلنا مدخلين مختلفين، لكن خانتي القيمة والناتج المكتوب اتفقتا.

إذا سلمناك خانة القيمة وحدها، فلا تستطيع اختيار أي النصين بدأنا به في هذا الاختبار. كلاهما مرشح تؤيده نتيجة التنفيذ. ولا يعيد استبدال كل فراغ بعلامة جمع المعلومة الناقصة؛ سيصنع نصا جديدا تختاره أنت بدلا من معرفة أي مدخل استعملناه.

لذلك تتضمن ورقة تجربتنا ثلاثة أعمدة مستقلة: المدخل الكامل، والقيمة المقروءة، والاستعلام الناتج. ضع علامة المطابقة في العمود الذي يجيب سؤالك. إن أردت حفظ الاسم فافحص القيمة، وإن أردت مراجعة الكتابة التي وصلت فاحتفظ بتلك الكتابة نفسها إلى جانب نتائج الفحص.

استعلامان مختلفان في تجربتنا يلتقيان عند القيمة Q R 8 والصيغة المكتوبة نفسها.
لم تبق في الناتج علامة تحدد أي مدخل من هذين المدخلين استعملناه.

أين تنتهي نتيجة التجربة؟

اختبرنا نصوصا قصيرة في الذاكرة ومفتاحا واحدا. لم نتحقق من قبول خدمة للاسم، ولا من تفسير خادم لمعاملها. كذلك لا نستنتج أن علامة الجمع تتغير في مسار عنوان أو في كل موضع آخر لمجرد تغيرها في مدخل الاستعلام الذي استعملناه.

قبل استعمال المثال مع اسم آخر، اكتب القيمة التي تريد استعادتها، ثم أجر المقارنة عليها. يمكن أن تضيف حالة تحتوي فراغا وحالة تحتوي جمعا كي لا تخفي واحدة خطأ الأخرى. احفظ النتيجة الفعلية لكل مدخل، ولا تنسب إلى التجربة حالات لم تمررها في الاختبار.

المراجع

  1. MDN — URLSearchParams constructor
    https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams
  2. MDN — URLSearchParams
    https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
أُعد هذا المقال بمساعدة الذكاء الاصطناعي. مراجعة تحريرية آلية؛ لا مراجعة بشرية أو اعتماد مهني. تاريخ الإعداد 13 أكتوبر 2026.

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي وراجعته أدوات ذكاء اصطناعي. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.