مُرمِّز / فاكّ ترميز URL
رمِّز النصوص بترميز النسبة المئوية أو فك ترميزها لاستخدامها بأمان في عناوين URL ومعلمات الاستعلام ومقاطع المسار.
- الصق النص الذي تريد ترميزه (أو فك ترميزه) في المربع أعلاه.
- اختر Component لقيمة استعلام أو مقطع مسار واحد، أو URL كامل لعنوان URL كامل به فقط بضعة أحرف غير آمنة.
- اضغط ترميز أو فك ترميز. يحل الناتج محل المدخلات في المكان نفسه.
- انسخ النتيجة أو اضغط مسح للبدء من جديد.
ماذا تفعل؟
يستبدل ترميز URL / النسبة المئوية الأحرف غير الآمنة أو الغامضة في عنوان URL بـ % متبوعاً بقيمة البايت UTF-8 بالنظام الست عشري. يستخدم وضع Component الدالة encodeURIComponent() ويرمّز كل حرف محجوز — وهو مناسب للقيم التي تُدرجها داخل سلسلة استعلام أو مسار. يستخدم وضع URL كامل الدالة encodeURI()، والتي تحافظ على الأحرف البنيوية في URL مثل :/?#&=.
مثال
المدخلات:
hello world & café / 日本語 مُرمَّز بوضع Component:
hello%20world%20%26%20caf%C3%A9%20%2F%20%E6%97%A5%E6%9C%AC%E8%AA%9E مُرمَّز بوضع URL كامل:
hello%20world%20&%20caf%C3%A9%20/%20%E6%97%A5%E6%9C%AC%E8%AA%9E لاحظ أن وضع URL الكامل يترك & و / كما هما لأن لهما دلالة بنيوية في URL.
الأخطاء الشائعة والملاحظات
معظم مشكلات الترميز تنتج من اختيار وضع خاطئ أو تشغيل الأداة مرتين على نفس المدخلات. فيما يلي أكثر الحالات شيوعاً.
- استخدام encodeURI لقيم الاستعلام. تُعيد encodeURI("a&b=c") السلسلة a&b=c دون تغيير، مما يكسر سلسلة الاستعلام. استخدم وضع Component (encodeURIComponent) للقيم.
- الترميز المزدوج. ترميز hello%20world مرةً أخرى يُعطي hello%2520world. فك الترميز أولاً أو تخطَّ طبقة واحدة.
- نسيان #. الحرف # داخل قيمة استعلام يُعامل كبداية جزء (fragment) ما لم يُرمَّز بـ %23.
- الخلط حول علامة +. تعني + مسافة في أجسام الطلبات form-encoded، لكنها + حرفية في مسار URL أو الاستعلام. لإرسال علامة + فعلية في قيمة استعلام، رمّزها بـ %2B.
- تسلسل نسبة مئوية غير صالح. وجود % حرفي لم يُرمَّز يجعل decodeURIComponent يطلق URI malformed. إمّا رمّز % بـ %25، أو أزِل علامات % المنفردة قبل فك الترميز.
- UTF-8 مقابل خوادم Latin-1 القديمة. تستخدم هذه الأداة UTF-8 دائماً. تتوقع بعض الأنظمة القديمة جداً Latin-1 / windows-1252 — هناك يكون é هو %E9 لا %C3%A9. إذا رأيت نصاً مشوّهاً، فالطرف الآخر ليس UTF-8.
الأسئلة الشائعة
ما الفرق بين encodeURI و encodeURIComponent؟
تُرمِّز encodeURIComponent كل شيء ليس حرفاً أو رقماً أو واحداً من -_.!~*'()، ولذا فهي آمنة لقيم الاستعلام الفردية ومقاطع المسار. تترك encodeURI الأحرف المحجوزة في URL مثل :/?#&= دون تغيير، فهي لترميز URL كامل ذي بنية موجودة. استخدم Component في 95٪ من الحالات؛ ولا تستخدم URL الكامل إلا إذا كان لديك URL صالح تقريباً يحتوي على بعض المسافات أو أحرف Unicode.
ما الأحرف التي تحتاج فعلاً إلى ترميز في سلسلة الاستعلام؟
يجب ترميز فواصل الاستعلام & و = داخل القيمة (وإلا ستبدو كفواصل). تُصبح المسافة %20 أو +. يجب ترميز علامة الجزء #. إضافةً إلى: /، ?، أي حرف غير ASCII، وأحرف التحكم. تتعامل encodeURIComponent مع كل ذلك، بينما تترك encodeURI &, =, /, ?, # دون ترميز لأنها بنيوية.
لماذا يتم ترميز عنوان URL الخاص بي مرتين؟
يحدث الترميز المزدوج عند ترميز قيمة سبق ترميزها. المسافة تصبح %20، ثم يصبح الرمز % نفسه %25 لتحصل على %2520. عادةً يحدث ذلك بتمرير URL مُرمَّز عبر encodeURIComponent مجدداً، أو عندما يُضيف إطار العمل ترميزاً تلقائياً فوق ترميزك اليدوي. فك الترميز مرة وأعد الترميز بنظافة، أو تخطَّ طبقة واحدة.
كيف تتعامل الأداة مع الأحرف غير ASCII مثل الرموز التعبيرية أو الحروف المُشكَّلة؟
تحوّل مُرمِّزات JavaScript الأحرف غير ASCII أولاً إلى بايتات UTF-8 ثم ترمّز كل بايت بالنسبة المئوية. فتصبح é هي %C3%A9 (بايتان)، ويصبح رمز تعبيري مثل 😀 هو %F0%9F%98%80 (أربعة بايتات). فك الترميز يعكس هذه العملية. هذا هو السلوك القياسي وفق RFC 3986 ويعمل مع كل خادم حديث.
لماذا يفشل فك الترميز مع رسالة "URI malformed"؟
تُطلق decodeURIComponent خطأً عند رؤية تسلسل نسبة مئوية غير صالح — % منفرد لا يتبعه خانتان ست عشريتان (مثل %ZZ أو مجرد %)، أو تسلسلات بايت UTF-8 غير صالحة (مثل %C3 بدون بايت تتمة صالح). الأسباب الشائعة: % حرفي في المدخلات لم يُرمَّز قط، أو سلسلة سبق فك ترميزها مرة ولا تزال تحتوي على علامات %.
هل تصبح المسافات + أم %20؟
كلاهما موجود عملياً. %20 صحيح في كل مكان — في المسارات وسلاسل الاستعلام والأجزاء. المختصر + يعني "مسافة" فقط داخل صيغة application/x-www-form-urlencoded المستخدمة في إرسالات نماذج HTML. تستخدم هذه الأداة %20 لأن encodeURIComponent تفعل ذلك. إذا كنت تحتاج + تحديداً، فاستبدل %20 بـ + بعد الترميز.