ترميز عناوين URL
رمّز قيم الاستعلام وعناوين URL الكاملة بترميز النسبة المئوية لاستخدامها في الكود
نبذة عن ترميز عناوين URL
تعطي أداة ترميز عناوين URL أنواع ترميز النسبة المئوية الثلاثة التي يحتاجها كود JavaScript عادة. يشغّل خيار «قيمة» الدالة encodeURIComponent، التي تطبق تخطي الأحرف على & = ? / # وعلى كل الأحرف الأخرى ما عدا الحروف والأرقام والرموز - _ . ! ~ * ' ( )، وذلك لمعامل استعلام واحد أو جزء واحد من المسار. ويشغّل خيار «عنوان URL كامل» الدالة encodeURI بين تسلسلات %XX الموجودة أصلا، فيحتفظ العنوان ببنيته ولا يصبح %20 أبدا %2520. ويطبق خيار «RFC 3986 الصارم» تخطي الأحرف على ! ' ( ) * أيضا. ويشغّل «فك الترميز» الدالة decodeURIComponent، ويقرأ أولا + كمسافة افتراضيا، كما تفعل بيانات النماذج. تعمل هنا، على جهازك، الاستدعاءات نفسها التي تكتبها في الكود.
مثال
قيمة استعلام مرمّزة بخيار «قيمة»، ثم عنوان كامل مرمّز بخيار «عنوان URL كامل»:
الإدخال
café au lait & croissants https://example.com/search?q=café au lait&page=2
ترميز
caf%C3%A9%20au%20lait%20%26%20croissants https://example.com/search?q=caf%C3%A9%20au%20lait&page=2
كيفية ترميز قيمة أو عنوان URL كامل
- 1الصق في المربع قيمة استعلام أو جزءا من المسار أو عنوان URL كاملا.
- 2في «نوع الترميز»، اختر «قيمة (معامل استعلام، جزء من المسار)» أو «عنوان URL كامل (يحتفظ بـ : / ? # & = + ; , @ $)» أو «RFC 3986 الصارم (وأيضا ! ' ( ) *)».
- 3انقر على «ترميز»، أو انقر على «فك الترميز» لتحويل تسلسلات %XX إلى أحرف من جديد.
- 4خذ السلسلة المرمّزة بزر «نسخ»، أو احصل عليها في الملف encoded.txt بزر «تنزيل».
الصيغ والحدود
- أوضاع الترميز
- encodeURIComponent؛ encodeURI مع الحفاظ على تسلسلات %XX الموجودة؛ encodeURIComponent مع تخطي الأحرف ! ' ( ) * أيضا
- فك الترميز
- decodeURIComponent، بعد تحويل + إلى مسافة ما لم تلغ تحديد تلك الخانة
- ما يحتفظ به «عنوان URL كامل»
- الحروف والأرقام والرموز - _ . ! ~ * ' ( ) وكذلك ; / ? : @ & = + $ , #
- الأخطاء
- تسلسل تخطي تالف يعطي «ترميز URL غير صالح»؛ ولا يمكن ترميز حرف بديل (surrogate) منفرد
استخدامات شائعة
- بناء سلسلة استعلام يدويا
- تحقق مما تعيده encodeURIComponent لعبارة بحث تحتوي على & أو # قبل ربط ?q= و&page= في استدعاء fetch أو أمر curl.
- تصحيح توقيع مرفوض
- عندما يتم رفض طلب OAuth 1.0a أو AWS Signature Version 4، رمّز كل معامل بخيار «RFC 3986 الصارم» وقارنه بسلسلة أساس التوقيع (signature base string) التي تسجلها مكتبتك.
- مطابقة redirect_uri
- يقارن مزود OAuth قيمة redirect_uri حرفا بحرف: ترميز https://app.example.com/callback بخيار «قيمة» يعطي https%3A%2F%2Fapp.example.com%2Fcallback، وهو الشكل الذي يوضع في عنوان URL الخاص بالتفويض.
- قراءة محتوى نموذج من سجل
- الصق محتوى application/x-www-form-urlencoded مثل name=Ann+Lee&city=S%C3%A3o+Paulo مع تحديد خانة +، فيعيد «فك الترميز» name=Ann Lee&city=São Paulo.
أي أداة تختار
- ترميز وفك ترميز عناوين URL: صفحة أدوات النصوص تشغّل الكود نفسه للروابط اليومية وعبارات البحث ومواضيع رسائل البريد الإلكتروني، مع شرح لا يذكر أسماء دوال JavaScript؛ شاركها مع شخص ليس مبرمجا.
- محلل عناوين URL: لعرض كل معامل استعلام في عنوان كامل مع قيمته بعد فك الترميز، كما تقرؤه فئة URL في المتصفح، بدلا من فك ترميز النص كسلسلة واحدة.
- ترميز HTML: عندما يوضع النص في صفحة HTML لا في عنوان: يكتب & و< حيث تكتب هذه الأداة %26 و%3C.
أين تتم معالجة نصك
يستدعي الترميز وفك الترميز دوال encodeURIComponent وencodeURI وdecodeURIComponent الخاصة بمتصفحك داخل هذه الصفحة، لذا لا يتم إرسال السلاسل التي تلصقها، بما فيها الرموز المميزة (tokens) والمفاتيح، إلى خوادمنا. عندما يفشل «ترميز» أو «فك الترميز» أو النسخ إلى الحافظة، نتلقى رسالة الخطأ من المتصفح واسم الأداة واسم متصفحك وإصداره، دون النص الذي تسبب فيه.
الأسئلة الشائعة
هل أستخدم encodeURIComponent أم encodeURI؟
استخدم encodeURIComponent («قيمة») لمعامل واحد: فهي تطبق تخطي الأحرف على & = ? / # حتى لا تنهي القيمة قبل أوانها. واستخدم encodeURI («عنوان URL كامل») لعنوان كامل يجب أن يبقى صالحا للعمل؛ فهي تترك : / ? # & = و+ دون تغيير.
لماذا تتحول + إلى مسافة عند فك الترميز؟
خانة «فك ترميز علامة + كمسافة (بيانات النماذج وسلاسل الاستعلام)» محددة افتراضيا، بما يطابق بيانات application/x-www-form-urlencoded. ألغ تحديدها عندما تعني + علامة زائد حقيقية، كما في a+b@x.com. ويرمّز خيارا «قيمة» و«RFC 3986 الصارم» علامة + إلى %2B، لذا لا تحتوي نتيجتهما أبدا على + غير مرمّزة.
هل ترمّز المسافات إلى %20 أم إلى +؟
إلى %20، في الأوضاع الثلاثة. لا يكتب أي منها + للمسافة؛ فهذا العرف يخص ترميز نماذج HTML، الذي تقرؤه هذه الأداة عند فك الترميز ولا تنتجه أبدا.
هل يرمّز عنوان URL مرمّز مسبقا مرتين؟
لا مع «عنوان URL كامل»: تبقى التسلسلات مثل %20 كما هي، فلا يتحول شيء إلى %2520. ونعم مع الوضعين الآخرين، حيث يصبح % نفسه %25، وهذا صحيح عندما يكون الحرف % جزءا من القيمة.
ما الوضع الذي أحتاجه لتوقيع OAuth 1.0a أو AWS Signature Version 4؟
«RFC 3986 الصارم». لا تترك المواصفتان دون تخطي إلا الحروف والأرقام والرموز - . _ ~، وهذا بالضبط ما ينتجه ذلك الوضع؛ أما encodeURIComponent وحدها فتحتفظ بـ ! ' ( ) * ولن يتطابق التوقيع المحسوب.
كيف أحصل على + للمسافات، كما يكتبها URLSearchParams؟
تكتب هذه الأداة %20 دائما. رمّز بخيار «قيمة»، ثم استبدل كل %20 بعلامة + في النتيجة؛ فأي + كانت في نصك أصبحت %2B بالفعل، لذا تبقى علامة زائد.
هل يقبل «فك الترميز» التسلسلات بالأحرف الصغيرة مثل %c3%a9؟
نعم. تقرأ decodeURIComponent الأرقام الست عشرية بالأحرف الصغيرة أو الكبيرة، لذا يعطي %c3%a9 و%C3%A9 كلاهما é. والتسلسلات التي تضيفها دوال الترميز تكون دائما بأحرف كبيرة.
لماذا يرفض «ترميز» سلسلتي برسالة عن حرف تالف؟
ترمي encodeURIComponent وencodeURI خطأ URIError عند وجود بديل (surrogate) منفرد من UTF-16، أي نصف زوج يشكل رمزا تعبيريا، وغالبا ما يبقى بعد قص سلسلة عند طول ثابت بـ slice أو substring. أصلح السلسلة حيث قصت؛ وتعرض الصفحة تلك الرسالة بدلا من نتيجة.
نصائح وحيل
- ✓رمّز أولا قيمة كل معامل بخيار «قيمة»، ثم اربط أزواج name=value بنفسك بعلامة &.
- ✓يترك «عنوان URL كامل» علامة + كما هي: ألغ تحديد خانة + قبل فك ترميز نتيجة كهذه، وإلا عادت أي + فيها مسافة.