ترميز وفك ترميز URL

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

1,050 مشاهدة

كيف يعمل

لا يمكن لأي رابط (URL) أن يحمل بأمان سوى مجموعة محدودة من الرموز: الحروف والأرقام والرموز الأربعة غير المحجوزة - _ . ~. كل ما عدا ذلك يُعاد كتابته كثلاثية %XX، حيث XX هي القيمة السداسية العشرية لبايت الحرف — وهذا ما يُعرف بـالترميز بالنسبة المئوية وفق RFC 3986. أما الأحرف التي تُشكِّل بنية الرابط (? # / : @ & =، وهي المجموعة "المحجوزة") فتُرمَّز أيضًا كلما ظهرت داخل قيمة بدلًا من كونها فواصل، لأن علامة & حرفية داخل قيمة استعلام قد تُقرأ خطأً كبداية للمعامل التالي.

يُرمَّز النص غير اللاتيني بايتًا بايتًا، وليس حرفًا حرفًا: تحوّل الأداة أولًا النص إلى UTF-8، ثم تُرمِّز كل بايت ناتج على حدة بالنظام السداسي عشري. الحرف التركي "ç" يتكوّن من بايتين في UTF-8 (0xC3 0xA7)، لذا يتحول إلى كتلتَين من الرموز المئوية، أي %C3%A7 — وليس رمزًا واحدًا. مثال ملموس: ترميز İstanbul çayı & simit ينتج عنه %C4%B0stanbul%20%C3%A7ay%C4%B1%20%26%20simit. لاحظ أن المسافة تصبح %20، والحرف المحجوز & يصبح %26، وكل حرف مُشكَّل يتوسع إلى تسلسله الخاص متعدد البايتات.

عمليًا، يبرز هذا الفرق أكثر ما يبرز عند تجميع الطلبات يدويًا: لصق رابط استدعاء ويب (webhook) يحتوي على قيمة استعلام أرسلها لك أحدهم، أو فك ترميز معامل تتبّع من رسالة تسويقية، أو معرفة سبب فشل استدعاء واجهة برمجة تطبيقات (API) لأن رمز & أو # خامًا تسرّب دون ترميز إلى قيمة ما وقُرئ كفاصل بدلًا من بيانات. ترميز القيمة أولًا، ثم إدراج الناتج في قالب الرابط، يتجنب تمامًا هذا النوع من الأخطاء.

ما يجب معرفته

  • %20 مقابل +: يستخدم الترميز بالنسبة المئوية وفق RFC 3986 دائمًا %20 للمسافة. أما اصطلاح + فينتمي إلى معيار آخر أقدم — وهو application/x-www-form-urlencoded المستخدم عند إرسال نموذج HTML لبياناته — ولا ينطبق إلا داخل صيغة الجسم تلك تحديدًا، وليس أبدًا داخل مسار أو قيمة استعلام مُرمَّزة بشكل صحيح بالنسبة المئوية. الخلط بين الاثنين مصدر كلاسيكي للأخطاء: فخادم يتوقع ترميز النموذج سيقرأ علامة + شاردة في نص مُرمَّز بالنسبة المئوية كعلامة جمع حرفية، لا كمسافة.
  • رمّز مكونًا واحدًا، لا الرابط بأكمله: صُممت هذه الأداة لقيمة استعلام واحدة أو جزء مسار واحد. تمرير العنوان بأكمله (بما في ذلك https://) عبر المُرمِّز سيُفلت أيضًا الشرطات المائلة والنقطتين اللتين تجعلان منه رابطًا صالحًا، فيُفسده تمامًا.
  • المحرك نفسه الذي يستخدمه متصفحك: تستدعي الأداة دالتَي المتصفح الأصليتين encodeURIComponent/decodeURIComponent، لذا تطابق النتائج تمامًا ما ينتجه متصفح حقيقي أو استدعاء JavaScript fetch — وليست تقريبًا.
  • التحويل ذهابًا وإيابًا غير فاقد: ترميز نص ثم فك ترميز الناتج يعيد دائمًا البايتات الأصلية بالضبط، ما يسهّل التحقق من صحة عملية ترميز يدوية بفك ترميزها ومقارنتها بالنص المصدر.
  • لا شيء يغادر متصفحك: يتم الترميز وفك الترميز بالكامل من جهة العميل، فوريًا، دون أي رفع للبيانات.

الأسئلة الشائعة

لماذا تتحول المسافة إلى %20 وليس +؟

يستخدم الترميز بالنسبة المئوية (RFC 3986) الرمز %20 للمسافة؛ أما اصطلاح + فخاص بصيغة application/x-www-form-urlencoded الأقدم المستخدمة في أجسام النماذج، وليس بالترميز العام للروابط. تستخدم هذه الأداة الصيغة القياسية %20 — والخلط بين الاثنين مصدر شائع للأخطاء عند بناء سلاسل الاستعلام يدويًا.

هل يُرمّز الرابط بأكمله أم جزءًا واحدًا فقط؟

صُممت لترميز مكوّن واحد فقط (قيمة استعلام أو جزء من المسار) — ترميز رابط كامل يتضمن "https://" سيُفلت الشرطات المائلة أيضًا ويُفسد الرابط، لذا رمّز الجزء الذي يحتاج ذلك فقط، ثم ألصق تلك القطعة في بقية العنوان.

لماذا تتحول الحروف التركية أو المُشكَّلة إلى أكثر من كتلة %XX واحدة؟

لأن الترميز يعمل على البايتات، لا على الحروف المرئية. يمثّل UTF-8 معظم الحروف غير اللاتينية — مثل ç وğ وı وş التركية، أو الرموز التعبيرية (إيموجي) — باستخدام بايتين إلى أربعة بايتات، ويحصل كل بايت على زوج %XX خاص به. لذا يصبح "ç" هو %C3%A7 (كتلتان)، وقد يتوسع رمز تعبيري واحد إلى ثمانية أحرف أو أكثر بعد الترميز.

ما الفرق بين الأحرف المحجوزة وغير المحجوزة؟

الأحرف غير المحجوزة (الحروف والأرقام و- _ . ~) آمنة دائمًا ولا تحتاج إلى ترميز أبدًا. أما الأحرف المحجوزة (? # / : @ & = وقليل غيرها) فلها معنى بنيوي داخل الرابط — إذ تفصل المسار عن الاستعلام، أو معاملًا عن آخر — لذا لا تُرمَّز إلا عندما تظهر كبيانات حرفية داخل قيمة، لا عندما تؤدي دور الفاصل.

هل يُرسَل نصي إلى أي مكان؟

لا — يتم الترميز وفك الترميز فورًا داخل متصفحك؛ لا يُرفع شيء إلى أي خادم.

التعليقات

لا توجد تعليقات بعد — كن أول من يكتب تعليقًا!

أدوات مشابهة