ماذا يعني « encoder » و« decoder » على عنوان URL؟
ترميز عنوان URL (« url encode » و« urlencode ») يحوّل كل حرف محظور في العنوان — المسافة والحروف المُشكَّلة وعلامة الفاصلة وعلامة الزائد — إلى تسلسل يبدأ بعلامة النسبة ثم الحرفان الست عشريان لبايته. فك ترميز عنوان URL (« url decode » و« decoder url ») يقرأ هذه التسلسلات بالعكس: تُعاد تكوين البايتات ثم تُحوَّل إلى حروف بحسب الترميز المعلن، وهو في الغالب UTF-8. هذا بالضبط ما يبحث عنه الناس عندما يكتبون « encoder decoder url » أو « percent encoding online ».
ليس percent-encoding ترميزًا ضاغطًا ولا تشفيرًا: تصبح الكلمة المُشكَّلة أطول ضِعفًا، وأي شخص يستطيع قراءتها بالعين المجردة. وظيفته الوحيدة هي تمرير أي بايت داخل عنوان URL، الذي لا يسمح افتراضيًا إلا بمجموعة فرعية من ASCII. وبالعكس، يُستخدم Base64 لنقل البايتات عبر قنوات نصية بالكامل — يتشابهان بصريًا لكنهما غير قابلين للاستبدال.
كيف ترمّز عنوان URL بـ percent-encoding
الخطوة 1: يُحوَّل النص إلى بايتات بحسب مجموعة الحروف المختارة، وUTF-8 افتراضيًا. الخطوة 2: لكل بايت نتحقق مما إذا كان الحرف المقابل مندرجًا في قائمة الحروف المسموح بها للنطاق المختار. الخطوة 3: إن كان مندرجًا فنسخ كما هو؛ وإلا فقد أصبح %XX، حيث XX هما الحرفان الست عشريان للبايت. الخطوة 4: إذا كان خيار المسافة بـ + مفعّل، فيُستبدل البايت 32 بعلامة الزائد بدل %20.
مثال عملي: « café & été » في نطاق المكوّن يعطي caf%C3%A9%20%26%20%C3%A9t%C3%A9. ما عليك سوى كتابة هذا النص في المُرمِّز: تظهر النتيجة وحجم المدخلات وحجم المخرجات والزيادة قبل أن ترفع إصبعك عن المفتاح.
نطاقات الترميز الأربعة
إنّ نطاق المكوّن لا يحفظ سوى الحروف والأرقام و - _ . ! ~ * ' ( ) : إنه نطاق قيمة البارامتر، ويُقابل encodeURIComponent. أمّا سلسلة الاستعلام فتحتفظ أيضًا بعلامات & و = لإعادة بناء query string كاملة. أمّا مقطع المسار فيسمح بـ / : @ & = + $ , ; حتى لا تنكسر الشرطات المائلة. أمّارابط URL كامل فيضيف أيضًا ?, #, [ و ] : لم يُرمَّز شيء تقريبًا، فالمستبعدة هي المسافات والحروف غير ASCII فقط إلى صيغة %XX.
كيف تفك ترميز عنوان URL مرمّز
يمسح فك الترميز السلسلة من اليسار إلى اليمين: علامة النسبة يليها حرفان ست عشريان فتنتج بايتًا، وكل حرف آخر يُنسخ بعد تحويله بحسب الترميز المختار. ثم تُجمع البايتات وتتحوّل إلى حروف — 2 بايت لـ « é »، و3 لـ « 日 »، و4 لإيموجي. ويعرض تبويب «فك الترميز» كل تسلسل مكتشف وموضعه في السلسلة وبايتاته والنص المقابل.
إذا لم تكن علامة النسبة متبوعة بحرفين ست عشريين صالحين، يظهر الخطأ بوضوح: تسلسل غير مكتمل أو حرف ست عشري غير صالح. أمّا زر «إصلاح الـ %» فيحوّل النسب المفردة إلى %25، فتصبح السلسلة قابلة لفك الترميز دون فقدان أي معلومة — وهذا الخيار الأكثر أمانًا لمعالجة عنوان URL مرمّز جزئيًا.
المسافة: %20 أو + — قاعدة النماذج
%20 هي مسافة percent-encoding الصارمة: تعمل في المسار والاستعلام والمقطع ورؤوس الطلبات. أمّا علامة +فلا تمثل مسافة إلا في صيغة application/x-www-form-urlencoded المستخدمة في نماذج HTML وفي query strings قديمًا. وفي غيرها تبقى علامة زائد حرفية — وبما أنها سهلة الخلط، فيجب ترميزها بـ %2B فورًا عند ترميز أي قيمة.
عمليًا: لتعبئة حقل نموذج أو لمحاكاة سلوك <form>، فعّل «المسافة بـ + ». أمّا بالنسبة لرابط إعادة توجيه أو canonical أو رابط مشترك، ففضّل دائمًا %20. أمّا المُفكِّك فيعامل + كمسافة افتراضيًا، ويمكنك تعطيل هذا السلوك بنقرة.
RFC 3986: unreserved، sub-delims وgen-delims
تفصّل RFC 3986 حروف ASCII إلى ثلاث فئات. أمّا الحروف غير المحجوزة — الحروف والأرقام، و - _ . ~ — تبقى محفوظة كما هي. أمّا شبه الفواصل ! $ & ' ( ) * + , ; = و الفواصل العامة : / ? # [ ] @ لها دلالة بنيوية: تفصل السلطة والمسار والاستعلام والمقطع. وكل ما عداها — المسافة وعلامات الاقتباس وأقواس الزوايا وأقواس المعقوفة وعلامة النسبة — يجب ترميزه.
هذه الفئات بالضبط ما يعرضه تبويب «RFC 3986 & المرجع» حرفًا حرفًا: انقر على بلاطة لعرض شيفرتها hex وفئتها ونطاقات الترميز التي تحفظها. إنه المرجع الأسرع للإجابة على سؤال «هل يجب لي ترميز هذا الحرف؟».
الحروف المُشكَّلة والإيموجي وUTF-8
ينقل عنوان URL البايتات الآمنة من ASCII فقط، لذا يجب ترميز أي حرف يتجاوز U+007F. في UTF-8 يساوي « é » C3 A9 ويصبح %C3%A9، و« 日 » يساوي 3 بايتات فينتج 3 تسلسلات، والإيموجي يشغّل 4 فيظهر بثمانية أحرف مرمّزة. إذا بدا النتيجة طويلة فليست خللًا: إنها ثمن التوافق مع كل البروتوكولات. وانتبه أخيرًا لمجموعة الحروف الأصلية — ففك ترميز UTF-8 لسلسلة مرمّزة بـ Latin-1 ينتج حروفًا مشوهة، ومن هنا الخيارات الأربعة المعروضة في تبويب «فك الترميز».
لماذا لا يكفي encodeURIComponent دائمًا
encodeURIComponent يرمّز كل شيء عدا A-Z a-z 0-9 - _ . ! ~ * ' ( )، وهو مناسب لقيمة بارامتر لكنه يكسر رابط URL الكامل لأنه يرمّز أيضًا الشرطات المائلة والنقطتين وعلامة الفاصلة. encodeURI يفعل العكس: يحافظ على بنية الرابط لكنه يترك المسافات والحروف المُشكَّلة، فيفشل مع النص الخام. الموقع يغطي التشغيلين — وأكثر، إذ يسدّ الفجوة بينهما نطاقا «سلسلة الاستعلام» و«مقطع المسار».
Percent-encoding وBase64: أداتان مختلفتان
يستبدل percent-encoding بايتًا بايتًا ويحافظ على قابلية قراءة النص الأصلي، على حساب حجم أكبر بشكل ملحوظ. أمّا Base64 فيجمّع البايتات 3ًا 3ًا ويعيد كتابتها بأبجدية من 64 حرفًا: مدمج لكنه غير مقروء تمامًا، وغير قابل للاستخدام كما هو داخل عنوان URL دون تنويعة URL-safe. ويعرض تبويب «ترميزات متقاطعة» الأداتين معًا بنظرة واحدة، مع مكافأة إضافية هي بايتات hex وكيانات HTML وسلسلة JSON المرمّزة — لتختار التمثيل المناسب قبل نسخ أي شيء.
أخطاء شائعة: الترميز المزدوج و % المفردة
الخطأ الأكثر شيوعًا هو ترميز نفس السلسلة مرتين: تصبح المسافة %20، ثم %2520، فيتلقى الخادم حرفيًا « %20 ». والخطأ الثاني هو نسيان علامة النسبة نفسها، التي يجب أن تصبح %25 — وإلا اعتبرها المُفكِّك بداية تسلسل فتعطّل أو يقصّ. وأخيرًا، إبقاء + غير مرمّز داخل بارامتر نموذج يعني إدراج مسافة لم تطلبها. يشير المُفكِّك إلى التسلسلات غير السليمة، ويصلح زر «إصلاح الـ %» الحالة الثانية دون فقدان.
أين تختبئ عناوين URL المرمّزة
في query strings التتبّع UTM، وفي redirect_uri وحالات OAuth، وفي webhooks التي يحوي رابطها الهدف بارامترات متداخلة، وفي URL de callback المرمّزة، وفي سجلات الخادم، وفي sitemaps وcanonical، وفي <a href> المولَّدة من جهة العميل، وفي JWT التي يكون حمولتها Base64URL، وفي data: وروؤوس Location، وفي كل نموذج HTML يُرسَل بطريقة GET. معرفة الترميز وفك الترميز في ثانية واحدة توفّر عليك فتح طرفية لمجرد سلسلة واحدة.
الأداء وأفضل الممارسات
في المتصفح، الترميز وفك الترميز خطّيان ولا يكلّفان شيئًا يُذكر، حتى مع عدة ميغابايت: يُعالَج كل حرف مرة واحدة، بلا استدامة ولا تخصيص لكل حرف. المخاطر الوحيدة هي الترميز المزدوج — تحقّق دائمًا من الجولة قبل التخزين — وعناوين URL التي تتجاوز عدة كيلوبايت، وغالبًا ما تقصّها الوسيطات بعد 2 000 حرف. وثّق النطاق المستخدم بجوار السلسلة الناتجة: «المكوّن» و«رابط URL الكامل» لا يعطيان النتيجة نفسها على النص نفسه.
موصى به للفئات التالية
مطوّرو back-end وfront-end (query strings وإعادة التوجيه وOAuth)، والمُدمجون وكتّاب المحتوى التقني (روابط UTM وcanonical والتتبّع)، ومسؤولو النظام وDevOps (webhooks وعناوين URL موقّعة وسجلات)، ومختبرو الأمن والاختبار واختبرو الاختراق (اختبار البارامترات وتجاوز المرشحات)، والطلبة (فهم UTF-8 وASCII وRFC 3986)، وكل من يحتاج إلى مُرمِّز ومفكك URL عبر الإنترنت سريع وشامل وخصوصي — ولتكميلهمُرمِّز ومفكك Base64 و منظِّم JSON.