ترميز وفك ترميز URL
لقيمة استعلام واحدة أو جزء مسار واحد. يرمّز كل شيء عدا الحروف والأرقام و - _ . ! ~ * ' ( )، تمامًا مثل encodeURIComponent.
الصق URL في الأعلى. تظهر هنا أجزاؤه ومعاملاته جاهزة للتعديل.
معاملات الاستعلام
لا يحتوي هذا URL على معاملات استعلام.
معاملات المعرّف الجزئي
كل شيء يعمل داخل متصفحك ولا يُرفع أي شيء تلصقه. وهذا مهم لأن عناوين URL كثيرًا ما تحمل رموز وصول ومعرّفات جلسات.
ترميز وفك ترميز URL أونلاين أثناء الكتابة: تحوّل الأداة المسافات والحروف المشكّلة ورموزًا مثل & أو ? إلى تسلسلات مرمّزة بالنسبة المئوية مثل %20، وتعيدها إلى نص مقروء. التبويب الثاني هو محلل URL. يقسّم أي عنوان إلى البروتوكول والمضيف والمسار ومعاملات الاستعلام، ويمكنك تعديلها أو تعطيلها أو تنظيفها من وسوم التتبع، وتكتب لك الأداة URL مرمّزًا بشكل صحيح. كل شيء يجري داخل متصفحك.
كيفية ترميز وفك ترميز URL
- اكتب أو الصق في الحقل داخل تبويب ترميز / فك ترميز. تتحدث النتيجة مع كل ضغطة مفتاح.
- اختر الاتجاه. ترميز يجعل النص آمنًا للاستخدام في URL، وفك الترميز يعيد
caf%C3%A9%20au%20laitإلىcafé au lait. إذا لصقت في الحقل الفارغ نصًا يحتوي على تسلسلات مثل%20تنتقل الأداة إلى فك الترميز من تلقاء نفسها (ويعيدك رمّزه بدلًا من ذلك إلى الترميز). وبالطريقة نفسها، إذا لصقت في وضع فك الترميز نصًا عاديًا يحتاج إلى ترميز، تنتقل الأداة إلى ترميز ويظهر فك ترميزه بدلًا من ذلك. - عند الترميز، اختر تحت ترميز بوصفه نوع النص (انظر القسم التالي). الخيار الافتراضي قيمة معامل مناسب لقيمة استعلام واحدة.
- نسخ يضع النتيجة في الحافظة. تبديل ينقل النتيجة إلى الحقل ويعكس الاتجاه. هذه طريقة سريعة للتحقق من سلامة التحويل: فك ترميز ما رمّزته للتو يجب أن يعيد نصك الأصلي.
يُظلَّل في النتيجة كل حرف غيّرته الأداة. مرّر المؤشر فوق حرف لترى الحرف ورمز Unicode الخاص به وبايتاته، مثل é U+00E9 %C3%A9. تحت الحقول ترى عدد الأحرف وبايتات UTF-8 والأحرف المرمّزة (أو الأحرف المفكوكة). جرّب مثالًا يحمّل الجملة السعر: خصم 50 % على القهوة & الشاي? نعم!، وفيها 40 حرفًا لكن 65 بايت UTF-8، لأن كل حرف عربي يشغل بايتين.
عند الترميز، كل سطر على حدة يرمّز كل سطر بمفرده ويُبقي فواصل الأسطر، وهذا يناسب قائمة قيم أو روابط. بدونه يُرمَّز فاصل السطر أيضًا ويصبح %0A. وعندما يكون النص URL يحتوي على معاملات، تعرض الأداة الزر قسّمه إلى أجزاء الذي يفتح العنوان في تبويب المحلل.
ترميز معامل في URL أو رابط كامل أو بيانات نموذج
ليس كل حرف يجب ترميزه في كل مكان. الشرطة المائلة تفصل المجلدات في المسار لكنها بيانات عادية داخل قيمة معامل، لذلك تعتمد النتيجة الصحيحة على ما ترمّزه. يقدّم ترميز بوصفه أربعة أوضاع:
- قيمة معامل يعمل مثل
encodeURIComponentفي JavaScript ويناسب قيمة استعلام واحدة أو جزء مسار واحد. يرمّز كل شيء عدا الحروف والأرقام و- _ . ! ~ * ' ( )، فلا يمكن لـ&أو=أو/أو?داخل القيمة أن تكسر URL. ترميزcafé & crèmeيعطيcaf%C3%A9%20%26%20cr%C3%A8me، جاهزًا للوضع بعدq=. - رابط كامل لعنوان كامل يحتاج إلى تنظيف فقط. يرمّز المسافات والأحرف غير ASCII وأحرف التحكم وعلامة الاقتباس المائلة للخلف (backtick) و
" < > \ ^ { | }، ويُبقي كل ما يمنح URL بنيته:: / ? # [ ] @ ! $ & ' ( ) * + , ; =. لذلك يصبحhttps://example.com/search?q=café au lait&lang=frهكذا:https://example.com/search?q=caf%C3%A9%20au%20lait&lang=fr. التسلسلات المرمّزة أصلًا تبقى كما هي، وعلامة%المنفردة تصبح%25. وهنا يختلف عنencodeURIفي JavaScript الذي يحوّل%20الموجودة إلى%2520ويرمّز أقواس عنوان IPv6 مثلhttp://[2001:db8::1]:8080/. - بيانات نموذج يتبع صيغة application/x-www-form-urlencoded (بالإنجليزية) التي تنتجها نماذج HTML و
URLSearchParams. تصبح المسافة+، ولا يبقى دون ترميز سوى الحروف والأرقام و* - . _، لذلك تُرمَّز! ' ( ) ~أيضًا. - RFC 3986 صارم لا يترك دون ترميز إلا الأحرف غير المحجوزة في RFC 3986 (بالإنجليزية): الحروف والأرقام و
- . _ ~. يشترط OAuth 1.0 (RFC 5849) وAWS Signature Version 4 هذه الصيغة بالضبط، لأن التوقيع لا يتطابق إلا إذا رمّز الطرفان!أو*بالطريقة نفسها.
الأحرف نفسها في كل وضع:
| الحرف | قيمة معامل | رابط كامل | بيانات نموذج | RFC 3986 صارم |
|---|---|---|---|---|
| مسافة | %20 | %20 | + | %20 |
& | %26 | & | %26 | %26 |
/ | %2F | / | %2F | %2F |
+ | %2B | + | %2B | %2B |
~ | ~ | ~ | %7E | ~ |
! | ! | ! | %21 | %21 |
* | * | * | * | %2A |
é | %C3%A9 | %C3%A9 | %C3%A9 | %C3%A9 |
يُرمَّز النص دائمًا بصيغة UTF-8 والأرقام الست عشرية دائمًا بأحرف كبيرة. إذا كان المدخل يحتوي أصلًا على تسلسلات مثل %20، تنبّهك ملاحظة إلى ذلك وتعرض فك ترميزه بدلًا من ذلك، حتى لا ترمّز النص مرتين عن طريق الخطأ.
لتمرير JSON في معامل استعلام، صغّره في منسق JSON ورمّزه بوضع قيمة معامل: يصبح {"id":7,"tags":["a","b"]} هكذا: %7B%22id%22%3A7%2C%22tags%22%3A%5B%22a%22%2C%22b%22%5D%7D. ويعمل الأمر بالعكس أيضًا: فك ترميز المعامل هنا ثم نسّقه هناك.
مشاكل فك ترميز URL: علامات الجمع و %2520 والتسلسلات التالفة
فك الترميز ينجح عادة من أول مرة، لكن أربعة مواقف تربك الناس. تعالج الأداة كلًا منها بدلًا من التوقف عند خطأ:
- علامة الجمع تمثّل مسافة في بيانات النماذج وفي معظم سلاسل الاستعلام. خيار اعتبار + مسافة عند الفك مفعّل افتراضيًا، فيُفك
caf%C3%A9+au+laitإلىcafé au lait. وفي رابط كامل تُعدّ مسافات علامات الجمع الواقعة بعد?فقط، لأن علامة الجمع في المسار حرف عادي. أوقف الخيار عندما تكون علامة الجمع مقصودة حرفيًا. أما علامة الجمع التي رُمِّزت%2Bفتبقى دائمًا علامة جمع. - الترميز المزدوج يحدث عندما تُرمّز طبقتان من الشيفرة القيمة نفسها، وهو ما يحذّر منه RFC 3986 صراحة. تصبح كل
%هي%25، فتتحول المسافة من%20إلى%2520. إذا بقيت في النتيجة المفكوكة تسلسلات مثل%20، تنبّه الأداة إلى أن النص رُمِّز مرتين على الأرجح وتعرض فك الترميز مرة أخرى. - التسلسل غير الصالح، أي
%لا يتبعها رقمان ست عشريان كما في100%أو%G1، يجعلdecodeURIComponentفي JavaScript يرمي URIError. هنا تُترك هذه التسلسلات كما هي، وتُظلَّل بالأحمر وتُعدّ، ويُفك باقي النص. - روابط Latin-1 القديمة جاءت من زمن ما قبل UTF-8، حين كانت بعض المواقع ترمّز
éكبايت واحد%E9.caf%E9ليس UTF-8 صالحًا، فيفشلdecodeURIComponentويعيدunquoteفي Python القيمةcafمتبوعة بحرف الاستبدال U+FFFD. تقرأ الأداة هذه البايتات بترميز Windows-1252، فتفكcaf%E9إلىcaféوتضيف ملاحظة بذلك.
أحرف التحكم في النص المفكوك، مثل علامة الجدولة أو البايت الصفري، تظهر برموز مرئية مثل ␉ و ␀، لكن نسخ ينسخ النص الحقيقي.
محلل URL: تقسيم الرابط وتعديل معاملات الاستعلام
الصق عنوانًا في حقل URL داخل تبويب تحليل وتعديل URL فيُقسَّم إلى البروتوكول والمضيف والمنفذ والمسار والمعرّف الجزئي، إضافة إلى اسم المستخدم وكلمة المرور إذا كان الرابط يحتويهما. تُعرض القيم مفكوكة الترميز، فالتبويب هو أسرع طريقة لفك ترميز معاملات URL أيضًا: تقرأ حذاء رياضي بدلًا من %D8%AD%D8%B0%D8%A7%D8%A1+%D8%B1%D9%8A%D8%A7%D8%B6%D9%8A. التعديل يعمل في الاتجاهين، مثل شريط العنوان وجدول المعاملات في Postman. غيّر حقلًا فيُعاد كتابة URL فورًا مرمّزًا بشكل صحيح، وغيّر URL فتُقرأ كل الأجزاء من جديد. الأجزاء التي لا تلمسها تبقى كما كانت حرفًا بحرف.
يسرد جدول معاملات الاستعلام كل معامل مع الاسم والقيمة. ألغِ تحديد تضمين في URL لاستبعاد معامل دون حذفه، وهذا مفيد عندما تبحث عن المعامل الذي يكسر الطلب. إضافة معامل وحذف المعامل وترتيب أبجدي تفعل ما تقوله أسماؤها. الأسماء المكررة مثل tag=a&tag=b والأسماء بلا قيمة مثل ?debug تُحفظ. المسافات في المعاملات يحدد ما إذا كانت المسافات تُكتب %20 أم +، وافتراضيًا يتبع الرابط الذي لصقته.
كثيرًا ما تحمل روابط تسجيل الدخول والدفع رابطًا ثانيًا داخل معامل، مرمّزًا حتى لا تختلط ? و& الخاصة به بتلك الخاصة بالرابط الخارجي:
https://auth.example.com/authorize?client_id=abc&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback%3Ftab%3D2
القيمة التي هي بذاتها URL، وغالبًا في redirect_uri أو return أو url أو next، يظهر لها زر تعديل الرابط الداخلي. يُفتح العنوان الداخلي https://app.example.com/callback?tab=2 كمستوى مستقل بأجزائه ومعاملاته، ويعيدك مسار التنقل (الرابط الرئيسي › redirect_uri) إلى الخارج، ويُرمَّز كل تغيير ويُكتب في الرابط الخارجي. نسخ الرابط الرئيسي ينسخ النتيجة. ويعمل هذا على عدة مستويات متداخلة.
عندما يبدو الجزء بعد # كمعاملات، كما في #access_token=...&state=... في تدفق OAuth الضمني أو #/search?q=shoes في مسارات تطبيقات الصفحة الواحدة، يسردها جدول ثانٍ هو معاملات المعرّف الجزئي.
ينبّه المحلل أيضًا إلى المشاكل: URL بلا بروتوكول تعامله المتصفحات كرابط نسبي، ومنفذ خارج النطاق من 0 إلى 65535، وأحرف يجب ترميزها مثل المسافات والحروف المشكّلة و " أو <، ويصلحها رمّزها بخطوة واحدة. النص الذي لا يحتوي عنوانًا، مثل a=1&b=2، يُقرأ كسلسلة استعلام. وبالنسبة إلى اسم نطاق إنترنت دولي تعرض الأداة صيغة Punycode التي يستخدمها DNS والمتصفحات، فيصبح münchen.de هو xn--mnchen-3ya.de، وتحصل النطاقات التي تبدأ بـ xn-- على صيغتها المقروءة.
نسخ URL ينسخ العنوان النهائي، وفتح يفتحه في تبويب جديد (روابط http وhttps فقط)، ونسخ بصيغة JSON يعطيك المعاملات ككائن JSON مع تجميع الأسماء المكررة في مصفوفة.
حذف UTM ومعاملات التتبع الأخرى من URL
الروابط القادمة من النشرات البريدية والإعلانات والشبكات الاجتماعية تحمل معاملات لا تخبر الموقع إلا من أين جاء الزائر. معلمات UTM وهي utm_source وutm_medium وutm_campaign وutm_term وutm_content تعود إلى Urchin، سلف Google Analytics. أما معرّفات النقر مثل fbclid (فيسبوك) وgclid (إعلانات Google) وmsclkid (إعلانات Microsoft) فتضيفها المنصات نفسها.
يضع المحلل على هذه المعاملات وسم تتبع، وحذف التتبع (n) يحذفها كلها دفعة واحدة. إلى جانب أي معامل utm_* يتعرف على أكثر من 20 معاملًا آخر، مثل ttclid (تيك توك) وmc_cid (Mailchimp) و_hsenc (HubSpot). المعاملات التي تحتاجها الصفحة تبقى في مكانها: في رابط المتجر الذي يحمّله جرّب مثالًا، يزيل حذف التتبع (4) المعاملات utm_source وutm_medium وutm_campaign وfbclid ويُبقي q وsize وreturn والمعرّف الجزئي #reviews.
الرابط الذي سيُوضع في رمز QR يستحق التنظيف هنا أولًا. فبدون معاملات التتبع يصبح أقصر، والرابط الأقصر يعطي رمزًا أقل كثافة وأسهل في المسح.
ما هو الترميز بالنسبة المئوية وكيف تتحول الأحرف إلى %XX
الترميز بالنسبة المئوية، ويسمى أيضًا ترميز URL، يكتب الحرف على هيئة % يتبعها رقمان ست عشريان. لا يجوز أن يحتوي URL إلا على مجموعة محدودة من أحرف ASCII، ولبعضها وظيفة: ? تبدأ الاستعلام، و& تفصل المعاملات، و# تبدأ المعرّف الجزئي. يسمي RFC 3986 هذه الأحرف محجوزة (: / ? # [ ] @ و ! $ & ' ( ) * + , ; =). أما الحروف والأرقام و - . _ ~ فغير محجوزة ولا تحتاج إلى ترميز أبدًا. وكل ما عدا ذلك، وكل حرف محجوز يُستخدم كبيانات عادية، يُرمَّز.
الأحرف خارج ASCII تُحوَّل أولًا إلى بايتات UTF-8، وكل بايت يحصل على %XX خاصة به:
éهو U+00E9، ويخزّنه UTF-8 في بايتين هما C3 A9، فيصبح%C3%A9.€هو U+20AC، ثلاثة بايتات:%E2%82%AC.- الرمز التعبيري مثل U+1F600 (وجه مبتسم) يشغل أربعة بايتات:
%F0%9F%98%80.
%c3%a9 و%C3%A9 تعنيان الشيء نفسه، لكن RFC 3986 يوصي بالأحرف الكبيرة، وهذا ما تكتبه الأداة. وهذا جدول ترميز النسبة المئوية لأكثر الأحرف شيوعًا:
| الحرف | مرمّزًا | الحرف | مرمّزًا |
|---|---|---|---|
| مسافة | %20 | + | %2B |
! | %21 | , | %2C |
" | %22 | / | %2F |
# | %23 | : | %3A |
$ | %24 | ; | %3B |
% | %25 | = | %3D |
& | %26 | ? | %3F |
' | %27 | @ | %40 |
( | %28 | [ | %5B |
) | %29 | ] | %5D |
* | %2A | فاصل سطر | %0A |
ترميز URL في JavaScript وPython وPHP
لكل لغة دوالها، وتختلف أساسًا في طريقة التعامل مع المسافات والشرطات المائلة و ! ' ( ) * ~.
تقدّم JavaScript الدالة encodeURIComponent (بالإنجليزية) للقيمة، وencodeURI للعنوان الكامل، وURLSearchParams لترميز النماذج:
encodeURIComponent("café & crème") // "caf%C3%A9%20%26%20cr%C3%A8me"
encodeURI("https://example.com/a b?q=café") // "https://example.com/a%20b?q=caf%C3%A9"
new URLSearchParams({ q: "café & crème" }).toString() // "q=caf%C3%A9+%26+cr%C3%A8me"
decodeURIComponent("caf%C3%A9") // "café"
decodeURIComponent لا تحوّل + إلى مسافة، وترمي URIError عند تسلسل غير صالح مثل 100%.
في Python توجد الدوال في urllib.parse. الدالة quote تُبقي / افتراضيًا (safe='/') وترمّز كل شيء آخر عدا الأحرف غير المحجوزة في RFC 3986. أما quote_plus فتكتب المسافات + وترمّز / أيضًا:
from urllib.parse import quote, quote_plus, urlencode, unquote_plus
quote("café & crème/brûlée") # 'caf%C3%A9%20%26%20cr%C3%A8me/br%C3%BBl%C3%A9e'
quote("a b/c", safe="") # 'a%20b%2Fc'
quote_plus("café & crème/brûlée") # 'caf%C3%A9+%26+cr%C3%A8me%2Fbr%C3%BBl%C3%A9e'
urlencode({"q": "café & crème", "page": 2}) # 'q=caf%C3%A9+%26+cr%C3%A8me&page=2'
unquote_plus("caf%C3%A9+au+lait") # 'café au lait'
في PHP، تُرمّز urlencode كما يفعل نموذج HTML وتكتب المسافة +، بينما تتبع rawurlencode المعيار RFC 3986 وتكتب %20:
urlencode("café & crème"); // "caf%C3%A9+%26+cr%C3%A8me"
rawurlencode("café & crème"); // "caf%C3%A9%20%26%20cr%C3%A8me"
rawurlencode تعطي النتيجة نفسها التي يعطيها RFC 3986 صارم. وurlencode تطابق بيانات نموذج عدا * التي ترمّزها %2A.
الأسئلة الشائعة
هل تُرمَّز المسافة في URL بـ %20 أم +؟
%20 تعمل في كل مكان من URL. أما + فتعني مسافة في سلسلة الاستعلام وفي بيانات النماذج فقط، وهي الصيغة التي ترسلها نماذج HTML. في المسار تكون + علامة جمع عادية، فيبقى /a+b كما هو /a+b. وعندما تحتاج قيمة الاستعلام إلى علامة جمع حقيقية فاكتبها %2B. في الأداة، بيانات نموذج يكتب المسافات + والأوضاع الثلاثة الأخرى تكتبها %20.
ماذا تعني %20 و %2F و %3D في URL؟
هي أحرف مرمّزة: %20 مسافة، و%2F شرطة مائلة، و%3D علامة يساوي. ومن الأخرى الشائعة %26 (&) و%3F (?) و%3A (:) و%2C (فاصلة) و%27 (فاصلة عليا). الرقمان هما رمز الحرف بالنظام الست عشري. الحروف المشكّلة وسائر أحرف غير ASCII تأخذ من زوجين إلى أربعة أزواج من هذا النوع، مثل %C3%A9 للحرف é. الصق السلسلة كاملة في أداة فك الترميز لقراءتها.
ما الفرق بين encodeURI و encodeURIComponent؟
الدالة encodeURI مخصصة لعنوان كامل وتترك الأحرف التي تكوّن بنيته، مثل : / ? # & =، دون تغيير. أما encodeURIComponent فمخصصة لجزء واحد، قيمة معامل أو جزء مسار، وترمّز هذه الأحرف أيضًا، فيصبح https://example.com/?a=1&b=2 هكذا: https%3A%2F%2Fexample.com%2F%3Fa%3D1%26b%3D2. في هذه الأداة، قيمة معامل يطابق encodeURIComponent، ورابط كامل يشبه encodeURI لكنه يُبقي التسلسلات الموجودة مثل %20 بدلًا من تحويلها إلى %2520.
كيف أحذف معاملات UTM من الرابط؟
الصق الرابط في تبويب تحليل وتعديل URL واضغط حذف التتبع (n). يحذف كل وسوم utm_* ومعرّفات النقر مثل fbclid وgclid دفعة واحدة. ثم اضغط نسخ URL. ولحذف بعضها فقط استخدم حذف المعامل في الصفوف التي لا تريدها.
هل ترميز URL هو نفسه التشفير أو Base64؟
لا. ترميز URL لا يخفي شيئًا: يستطيع أي شخص فك caf%C3%A9 إلى café، لذلك لا يحمي كلمة مرور ولا رمزًا. هو يجعل الأحرف آمنة للاستخدام في العنوان فقط. أما Base64 فترميز مختلف يحوّل أي بيانات، بما فيها الملفات الثنائية، إلى سلسلة من 64 حرفًا. وسلسلة Base64 داخل URL ما زالت تحتاج إلى ترميز + و/ و=، إلا إذا استخدمت صيغة URL الآمنة التي تنتجها أداة ترميز وفك ترميز Base64.
هل تُرفع عناوين URL التي ألصقها أو تُخزَّن؟
لا. الترميز وفك الترميز والتحليل تجري داخل متصفحك، ولا يُرسل شيء مما تلصقه إلى خادم. وهذا مهم لأن عناوين URL كثيرًا ما تحمل رموز وصول أو معرّفات جلسات أو رموز إعادة تعيين كلمة المرور. يتذكر المتصفح التبويب والخيارات التي اخترتها فقط، ولا يتذكر النصوص أبدًا. والشيء الوحيد الذي يحمّل العنوان هو فتح، الذي يفتحه في تبويب جديد تمامًا كما لو نقرت على الرابط.
المزيد من الأدوات للمبرمجين في فئة المطورون، والأدوات التي تحوّل صيغة إلى أخرى مجمّعة في المحولات. ولمعرفة ما يختلف بين رابطين طويلين، مثل استدعاء API ناجح وآخر فاشل، الصقهما في أداة مقارنة النصوص وقارن بالأحرف.