أسئلة شائعةقراءة 5 دقائق

ترميز المسافات في الروابط: ‎%20 مقابل ‎+ (متى تستخدم أيًّا منهما)

‏‎%20 هو ترميز percent-encoding القياسي لحرف المسافة وفقًا لمعيار ‏`RFC 3986`، ويجب استخدامه في مسارات الروابط ومعظم السياقات. أما علامة ‎+ فتمثّل المسافة فقط في تنسيق ‏`application/x-www-form-urlencoded` المستخدَم عند إرسال نماذج HTML وبعض سلاسل الاستعلام.

ماذا يعني ‎%20؟

%20 هو التمثيل بترميز percent-encoding لحرف المسافة (رمز ASCII رقم 32، أي 0x20 بالنظام الست عشري) كما هو معرَّف في RFC 3986. وهو الطريقة القياسية لتمثيل المسافات في أي جزء من عنوان URI، بما في ذلك أجزاء المسار وسلاسل الاستعلام ومعرّفات الأجزاء (fragment identifiers).

عندما ترى %20 في رابط، فهذا يعني ببساطة "توجد مسافة هنا". فمثلًا، يشير https://example.com/my%20file.pdf إلى مورد اسمه "my file.pdf". و%20 مفهوم عالميًّا لدى جميع خوادم الويب والمتصفحات ومكتبات HTTP.

ماذا تعني ‎+ في الرابط؟

جاءت علامة + لتمثيل المسافة من نوع المحتوى application/x-www-form-urlencoded، الذي عُرِّف في مواصفة HTML لترميز بيانات النماذج. فعندما يُرسَل نموذج HTML باستخدام طريقة GET، يقوم المتصفح بترميز المسافات على هيئة + في سلسلة الاستعلام الناتجة.

فمثلًا، إذا كتبت "hello world" في نموذج بحث وأرسلته، يولّد المتصفح رابطًا مثل https://example.com/search?q=hello+world. وتعني + هنا "مسافة"، لكن فقط لأن سلسلة الاستعلام تستخدم تنسيق form-urlencoded.

من المهم ملاحظة أن + ليس لها أي معنى خاص خارج تنسيق application/x-www-form-urlencoded. ففي مسار رابط مثل /files/my+file.pdf، تكون + علامة زائد حرفية، وليست مسافة. والملف المشار إليه اسمه حرفيًّا "my+file.pdf".

الفرق الجوهري

يكمن الفرق الأساسي في المواصفة التي ينتمي إليها كلٌّ منهما. فـ%20 معرَّف في RFC 3986 (الخاص بعناوين URI) ويعمل في كل مكان داخل الرابط. أما اصطلاح استخدام + كمسافة فهو معرَّف في مواصفة HTML/WHATWG الخاصة ببيانات النماذج، ولا يعمل إلا في سلاسل الاستعلام التي تُعامَل صراحةً على أنها بيانات form-urlencoded.

  • %20 يعمل في المسارات وسلاسل الاستعلام والأجزاء وجميع سياقات URI
  • + لا تعني "مسافة" إلا في سلاسل استعلام application/x-www-form-urlencoded
  • في مسارات الروابط، تكون + علامة زائد حرفية وليست مسافة
  • %20 آمن دائمًا، بينما + يعتمد على السياق
  • إذا رمّزت علامة + حرفية في بيانات النموذج، فإنها تصبح %2B

أيهما ينبغي أن تستخدم؟

استخدم %20 عند بناء الروابط برمجيًّا، أو إنشاء طلبات REST API، أو ترميز أجزاء المسار، أو كلما كنت غير متأكد. فهو الترميز الصحيح عالميًّا للمسافات في عناوين URI.

استخدم + فقط عندما تنتج عن قصد بيانات application/x-www-form-urlencoded، مثل بناء سلاسل استعلام تحاكي إرسال نماذج HTML، أو عندما تشترط واجهة برمجية هذا التنسيق صراحةً.

تقبل معظم الواجهات البرمجية وأطر العمل الحديثة كلًّا من %20 و+ في سلاسل الاستعلام. ومع ذلك، فإن استخدام %20 أكثر قابلية للنقل ويتجنّب الالتباس، خصوصًا عندما قد تُستخدَم سلسلة الاستعلام في سياقات خارج إرسال النماذج.

كيف تتعامل اللغات المختلفة مع المسافات

قد تعتمد لغات البرمجة المختلفة ومكتباتها القياسية إما %20 أو + افتراضيًّا لترميز المسافات. ومعرفة السلوك الافتراضي للغتك يساعدك على تجنّب المفاجآت.

// JavaScript
encodeURIComponent('hello world');  // "hello%20world" (%20)
new URLSearchParams({q: 'hello world'}).toString();  // "q=hello+world" (+)

// لفرض استخدام %20 في سلاسل الاستعلام:
new URLSearchParams({q: 'hello world'}).toString().replace(/\+/g, '%20');
# Python
from urllib.parse import quote, quote_plus, urlencode

quote('hello world', safe='')    # "hello%20world" (%20)
quote_plus('hello world')        # "hello+world" (+)
urlencode({'q': 'hello world'})  # "q=hello+world" (+ افتراضيًّا)

# لفرض استخدام %20:
urlencode({'q': 'hello world'}, quote_via=quote)  # "q=hello%20world"
// PHP
rawurlencode('hello world');  // "hello%20world" (%20)
urlencode('hello world');     // "hello+world" (+)

// rawurlencode يتبع RFC 3986
// urlencode يتبع application/x-www-form-urlencoded

مقالات ذات صلة

جرّب أدواتنا المجانية