تخطَّ إلى المحتوى

ترميز URL

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

  • لا يُخزَّن أبدًا
  • لا طابور ولا انتظار
  • دون تسجيل ودون علامة مائية
بعد الترميز

يظهر بعد الترميز هنا.

كيف تعمل الأداة

1

الصق نصك

أي نص، بأي لغة. يُرمَّز بـ UTF-8، وهو ما يتوقعه كل خادم حديث.

2

اختر المهمة

قيمة واحدة ستوضع في سلسلة استعلام، أو رابط URL كامل مُجمَّع، أو إرسال نموذج. الفرق مهم، وكلٌّ منها مشروح.

3

انسخ النتيجة

رمّز سطرًا سطرًا إن كانت لديك قائمة تريد ترميزها دفعة واحدة.

ثلاث إجابات صحيحة، ولماذا يُعد الزر الواحد خطأً

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

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

المسافة هي الحرف الذي يحمل أطول تاريخ. في رابط URL تكون %20. وفي نموذج HTML مُرسَل تكون +، وهو ترميز منفصل أقدم بقي لأن النماذج تعمل بهذه الطريقة منذ 1994. وكلاهما صحيح في سياقه ولا أحد منهما صحيح في سياق الآخر، ولهذا تكون علامة الجمع في سلسلة الاستعلام ملتبسة بطريقة لا يصلحها أي قدر من الحرص عند الترميز.

يُرمَّز النص غير ASCII إلى UTF-8 أولًا ثم بايتًا بايتًا، لذا يصبح الحرف المشكَّل الواحد تسلسلين بالنسبة المئوية، ويصبح الرمز التعبيري أربعة. أما الترميز المزدوج فهو العلّة الكلاسيكية: ترميز شيء مرمَّز أصلًا يحوّل كل % إلى %25، فتصبح %20 هي %2520 ويستقبل الطرف الآخر علامة نسبة مئوية حرفية. وإذا امتلأ رابط URL بـ %25، فقد مرّ عبر مُرمِّز زائد.

عندما تحتاج إلى شيء آخر

في الكود، استخدم الدالة الخاصة باللغة واختَرها بالقدر نفسه من الوعي الذي تفرضه عليك هذه الصفحة. في JavaScript توجد encodeURI للعناوين الكاملة وencodeURIComponent للقيم؛ وفي Python توجد urllib.parse.quote مع وسيط safe يترك الشرطات المائلة افتراضيًا؛ وفي PHP يُفرَّق بين rawurlencode وurlencode، اللتين تختلفان تحديدًا في مسألة المسافة مقابل علامة الجمع المذكورة أعلاه. والأفضل من ذلك أن تبني الروابط بنوع URL مخصص بدلًا من دمج النصوص، فيختفي السؤال من أساسه.

في سطر الأوامر، يرمّز jq -rR @uri بأمان ويتعامل مع القوائم، ويبني curl --data-urlencode معاملًا مرمَّزًا بشكل صحيح دون أن تحتاج إلى التفكير في أي الحالات الثلاث أنت — وهذا هو المكان الوحيد الذي يكون فيه الأمر سهلًا فعلًا.

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

أيّ الثلاثة أستخدم؟

«قيمة واحدة»، في كل الحالات تقريبًا. استخدمه حين ترمّز قيمة واحدة فقط ستوضع في سلسلة استعلام أو جزء من مسار — عبارة بحث، أو عنوان بريد إلكتروني، أو وجهة إعادة توجيه. وهو الوحيد بين الثلاثة الذي يُهرّب & و= و? و/، وهذا بالضبط ما يمنع قيمتك من الخروج من معاملها لتصبح معاملين. استخدم «رابط URL كامل» فقط حين يكون لديك رابط URL مكتمل وتريد تنظيف أحرفه غير الآمنة فقط؛ فهو يترك الأحرف البنيوية كما هي عن قصد ليبقى الرابط رابطًا. واستخدم «بيانات نموذج» حين تبني جسم طلب application/x-www-form-urlencoded، حيث تكون المسافة + بدلًا من %20.

لماذا أفسدت علامة «&» الرابط؟

لأنها لم تُرمَّز، وعلامة & هي ما تفصل به سلسلة الاستعلام بين معامل والذي يليه. القيمة «Smith & Sons» المُلحقة كما هي بـ ?company= تصل إلى الخادم على شكل company=Smith ومعامل ثانٍ فارغ اسمه «Sons». هذه أكثر علّة شائعة في روابط URL، والحل هو ترميز «قيمة واحدة» — فهو يحوّل & إلى %26 فتبقى القيمة قيمة واحدة.

لماذا تحولت علامة «+» إلى مسافة؟

لأن + في سلسلة الاستعلام تعني مسافة — قاعدة موروثة من نماذج HTML لم يستطع أحد إزالتها قط. لذا فإن علامة الجمع الحرفية في بياناتك، في رقم هاتف أو سلسلة Base64، يقرؤها الخادم المستقبِل كمسافة. وترميز «قيمة واحدة» يُهرّبها إلى %2B، فتصل سليمة.

هل يتعامل مع اللغات الأخرى والرموز التعبيرية؟

نعم. يُحوَّل النص إلى UTF-8 أولًا ثم يُرمَّز بالنسبة المئوية بايتًا بايتًا، وهذا ما يتطلبه RFC 3986 وما يتوقعه كل خادم حديث. اليابانية والعربية واللاتينية المشكَّلة والرموز التعبيرية كلها تعود كما هي تمامًا بعد الترميز وفكه.

لماذا تُرمَّز ! ' ( ) * هنا بينما تتركها أدوات أخرى؟

لأن دالة encodeURIComponent المدمجة في المتصفح تترك هذه الخمسة كما هي، بينما يدرجها RFC 3986 ضمن الأحرف المحجوزة. وبعض الخوادم وأطر العمل تعاملها كأحرف بنيوية، لذا قد تُساء قراءة القيمة التي تحتوي عليها. وترميزها غير ضار — فهي تعود كما هي تمامًا بعد فك الترميز في كل مكان — ويزيل فئة كاملة من العلل النادرة التي يصعب تشخيصها. وهذا ما تفعله التطبيقات الدقيقة.

هل يُخزَّن نصي في أي مكان؟

لا. لا يُخزَّن أي شيء ولا يُرسَل أي طلب. يمكنك قطع الاتصال بالإنترنت بعد تحميل الصفحة وستستمر في العمل.

معلومة مفيدة: هناك ثلاث إجابات صحيحة مختلفة، والصفحة تطلب منك الاختيار، لأن زر الترميز الواحد المعتاد مخطئ في ثلثي الحالات. ترميز رابط URL كامل، وترميز معامل استعلام، وترميز جزء من المسار يُهرّب كلٌّ منها أحرفًا مختلفة؛ واستخدام الخطأ منها يُفسد بصمت الشرطات المائلة أو علامات الجمع أو علامات &.

أضِف هذه الأداة إلى موقعك

مجانية لأي مدونة أو صفحة فصل دراسي أو مقالة مساعدة. الصق مقتطفًا واحدًا وسيتمكن زوارك من استخدامها مباشرةً على صفحتك.