باختصار: يستبدل ترميز URL (الترميز المئوي) الأحرف غير الآمنة بتسلسلات %XX ليصمد الرابط أمام المسافات والحروف المشكّلة والرموز. تصير المسافة %20، وعلامة العطف %26. والحيلة هي معرفة متى تُرمّز رابطًا كاملًا مقابل قيمة استعلام واحدة — وأن encodeURIComponent وencodeURI ليسا متبادلين.

لا يمكن للرابط أن يحوي بأمان سوى مجموعة محدودة من الأحرف. أما الباقي — المسافات والحروف المشكّلة والرموز المحجوزة مثل ? و& و# و= — فيجب ترميزه نسبيًا، وإلا انكسر الرابط أو أشار إلى غير موضعه.

ماذا يفعل الترميز المئوي فعلًا

يُستبدَل كل حرف غير آمن بعلامة نسبة متبوعة بقيمة بايته الست عشرية. المسافة %20، والعطف %26، وعلامة الاستفهام %3F. ويعكس فكّ الترميز العملية، فيعيد كل %XX صالح إلى حرفه الأصلي.

%20 مقابل + للمسافات

كلاهما قد يعني «مسافة»، لكن ليس في الموضع نفسه. %20 هي المسافة المُرمَّزة نسبيًا المستخدمة في كامل مسار الرابط واستعلامه. أما علامة الزائد + فتعني مسافة فقط في سياق application/x-www-form-urlencoded — إرسال النماذج وسلاسل الاستعلام — وتُعامَل حرفيًا في غيره. عند الشك، %20 هي الأكثر أمانًا وشمولًا.

encodeURIComponent مقابل encodeURI

هذا هو الفرق الذي يوقع في الخطأ. استخدم encodeURIComponent لقيمة واحدة تضعها داخل رابط — مثل كلمة البحث في ?q=hello%20world. فهو يُرمّز الأحرف المحجوزة مثل & و= كي لا تُحسب جزءًا من بنية الرابط. واستخدم encodeURI على رابط كامل فقط، حيث يجب أن تحتفظ تلك الأحرف المحجوزة بمعناها البنيوي. ترميز رابط كامل بـ encodeURIComponent يفسد :// و? الخاصة به؛ وترميز معامل واحد بـ encodeURI يترك الأحرف المحجوزة من دون ترميز.

متى تُرمّز

  • عند بناء سلسلة استعلام من إدخال المستخدم (كلمات بحث، مرشّحات، أسماء).
  • عند وضع رابط داخل آخر كمعامل ?redirect= أو ?url=.
  • عند التعامل مع أسماء ملفات أو مسارات تحوي مسافات أو حروفًا مشكّلة.
  • عند تنقيح رابط يعمل محليًا لكنه ينكسر عند مشاركته.

ترميز URL ليس Base64

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

سير عمل عملي

الصق القيمة الخام في مُرمِّز/فاكّ ترميز URL لترميز معامل أو فكّ سلسلة %XX مريبة — فهو يفكّ التسلسلات الصالحة ويشير إلى غير الصالحة بدل إفسادها بصمت. وإن مرّ المحتوى نفسه عبر Base64، فافحصه بـ مُرمِّز/فاكّ Base64 لتطبيق الخطوتين بالترتيب الصحيح.

أخطاء شائعة يجب تجنّبها

  • ترميز رابط كامل بـ encodeURIComponent وكسر بنيته.
  • افتراض أن + تعني مسافة في أي موضع من الرابط.
  • الترميز المزدوج — تمرير سلسلة مُرمَّزة سلفًا عبر المُرمِّز مجددًا.
  • الخلط بين الترميز المئوي وBase64.

رمّز الأجزاء لا الكل، فيسافر رابط فيه مسافات أو حروف مشكّلة أو رابط متداخل سليمًا.