ترميز URL وفك ترميزه، مشروحًا للمطورين
اكتب مسافة في عنوان URL، أو كلمة بالحروف السيريلية، أو علامة العطف التي تخص بياناتك لا العنوان نفسه، ولا بد أن يحدث شيء ما. فالويب لا يضمن النقل الآمن إلا لمجموعة صغيرة متوقعة من أحرف ASCII. وكل ما عداها يجب أن يُغلّف بصيغة تتفق عليها أجهزة التوجيه والخوادم والمتصفحات جميعًا. تلك الصيغة هي الترميز بالنسبة المئوية، ويُسمى بشكل أكثر شيوعًا ترميز URL، وتتيح لك هذه الصفحة تحويل النص في كلا الاتجاهين مباشرة في متصفحك.

ما هو الترميز بالنسبة المئوية فعلًا
القاعدة ميكانيكية وسهلة الاتباع. فأي حرف لا يمكن أن يظهر حرفيًا يُستبدل بعلامة % متبوعة برقمين سداسيين عشريين يعبّران عن قيمة بايت ذلك الحرف. فالمسافة تصبح %20. وعلامة الزائد تصبح %2B. وعلامة الرقم تصبح %23. وحين يُمثَّل حرف بعدة بايتات، كما هو حال معظم النص غير ASCII في UTF-8، تحصل ببساطة على عدة ثلاثيات متتالية: فرمز اليورو يتحول إلى %E2%82%AC. ويعكس فك الترميز العملية، إذ يقرأ كل ثلاثية ويعيدها إلى بايتها الأصلي.
هذا الاصطلاح مُعرَّف في مواصفة URI (المعيار RFC 3986) وهو مُمل عمدًا. والإملال هو المقصود. فكل عميل وخادم HTTP حسن السلوك على الكوكب ينفّذ القواعد نفسها، لذا فإن رابطًا مُرمَّزًا بشكل صحيح في مكان واحد يصل سليمًا في كل مكان آخر.
لماذا يجب أن يوجد
تحمل عناوين URL نوعين من الأحرف لهما وظيفتان مختلفتان جدًا. فـ الأحرف المحجوزة مثل / و? و# و& و= و: أحرف بنيوية. فهي تخبر المحلّل أين ينتهي المسار وأين تبدأ سلسلة الاستعلام، أو أين يتوقف معامل ويبدأ التالي. فإن احتوت بياناتك الفعلية على أحد هذه الرموز، وجب ترميزه كي لا يخطئ المحلّل ويعدّه علامة ترقيم. فمرجع طلب مثل A&B/2024 لو وُضع خامًا في سلسلة استعلام لقُرئ خطأً على أنه معاملان ومقطع مسار.
ثم هناك الأحرف غير الآمنة وغير ASCII: المسافات وعلامات الاقتباس والأقواس الزاويّة والحروف المنبَّرة والرموز التعبيرية، وأي شيء خارج نطاق ASCII البسيط. وهذه ليس من شأنها أن تظهر حرفيًا في عنوان URL، إما لأنها تتشوه أثناء النقل أو لأنه ليس لها تمثيل مُعرَّف. وترميزها يُبقي الروابط نظيفة ومتوقعة بدلًا من ترك النتيجة للحظ.
أين يظهر في العمل الحقيقي
سلاسل الاستعلام هي الحالة الكلاسيكية. فكل قيمة تلحقها بـ ?key=... ينبغي ترميزها كي لا يكسر إدخال المستخدم البنية. وينطبق الأمر نفسه على إرساليات نماذج HTML المُرسَلة بصيغة application/x-www-form-urlencoded، حيث يرمّز المتصفح قيم الحقول تلقائيًا (ويحوّل المسافات، بحكم اصطلاح تاريخي، إلى + بدل %20). كما ستصادفه عند بناء روابط تشير إلى صفحات بعناوين غير لاتينية، وعند تركيب طلبات واجهات برمجة التطبيقات يدويًا، وعند تمرير وجهات إعادة التوجيه كمعاملات، وعند تصحيح سبب وصول طلب يبدو سليمًا في شريط العناوين مشوّهًا إلى الخادم.

encodeURI مقابل encodeURIComponent
تأتي JavaScript بمُرمِّزين، واختيار الخطأ منهما خلل شائع. والفرق يتعلق بالنطاق. فـ encodeURIComponent مخصص لقطعة بيانات مفردة، مثل قيمة استعلام واحدة. وهو يرمّز كل شيء تقريبًا، بما في ذلك الأحرف المحجوزة / و? و: و@ و& و= و+ و#. وهذا تحديدًا ما تريده حين يُسمح للبيانات باحتواء تلك الرموز كنص عادي.
أما encodeURI فمخصص لعنوان كامل تنوي إبقاءه عاملًا. وهو يترك الأحرف البنيوية وشأنها، فتنجو الشرطات المائلة والنقطتان الرأسيتان وعلامات الاستفهام التي تتماسك بها عناوين URL. استخدمه حين يكون لديك عنوان URL كامل وتريد فقط تنظيف المسافات أو الأحرف غير ASCII؛ والجأ إلى encodeURIComponent كلما كنت تُدرج قيمة داخل عنوان URL أكبر. وقاعدة بسيطة تُسترشد بها: رمّز الرابط كله بـ encodeURI، ورمّز الأجزاء التي تحشرها فيه بـ encodeURIComponent.
كل شيء يبقى على جهازك
تعمل هذه الأداة بالكامل في متصفحك. فالنص الذي تلصقه يُرمَّز أو يُفكّ ترميزه محليًا بالإجراءات القياسية نفسها ولا ينتقل إلى خادم أبدًا، ما يجعله آمنًا للرموز والمعاملات الموقّعة أو أي شيء آخر تفضّل ألا ترسله عبر الشبكة. وإن كنت تعمل مع تحويلات نصية أخرى، فإن محوّل Base64 يجاوره مباشرة، ويمكنك تصفّح المجموعة الكاملة من أدوات المطورين لمزيد من المساعدات اليومية.
الأسئلة الشائعة
ماذا يعني %20 في عنوان URL؟
إنها مسافة مُرمَّزة. فحرف المسافة غير مسموح به حرفيًا في عنوان URL، لذا يُستبدل بعلامة النسبة المئوية والقيمة السداسية العشرية 20، وهي قيمة بايت المسافة.
لماذا أرى أحيانًا علامة زائد بدلًا من %20؟
تُرمّز بيانات نموذج HTML من نوع application/x-www-form-urlencoded المسافات بعلامة زائد بحكم اصطلاح تاريخي. أما في المسار أو الاستعلام العادي فتُرمَّز المسافة بـ %20. وكلاهما يعود إلى مسافة عند فك الترميز في سياقه الصحيح.
متى ينبغي استخدام encodeURIComponent بدلًا من encodeURI؟
استخدم encodeURIComponent لقيمة مفردة تُدرجها في عنوان URL، مثل معامل استعلام، لأنه يرمّز الأحرف المحجوزة أيضًا. واستخدم encodeURI لعنوان كامل حين تريد الحفاظ على الشرطات المائلة والنقطتين الرأسيتين وعلامات الاستفهام التي تتماسك به.
هل يغيّر ترميز URL معنى بياناتي؟
لا. الترميز قابل للعكس بالكامل. فك ترميز النتيجة يعيد النص الأصلي بدقة، بايتًا ببايت، طالما استُخدمت مجموعة الأحرف نفسها في الطرفين.
كيف تُعالَج الأحرف غير ASCII مثل الحروف المنبَّرة أو الرموز التعبيرية؟
تُحوَّل أولًا إلى بايتات UTF-8، ثم يصبح كل بايت ثلاثيته الخاصة بالنسبة المئوية. لذا يمكن لحرف منبَّر واحد أو رمز تعبيري واحد أن يتوسع إلى عدة ثلاثيات في المُخرَج المُرمَّز.
هل يُرسَل نصي إلى خادم عند استخدام هذه الأداة؟
لا. يجري الترميز وفك الترميز بالكامل في متصفحك. لا يُرفع أي شيء تلصقه، لذا فمن الآمن استخدامها مع سلاسل خاصة أو حساسة.
