أدوات المطور · URL التشفير وفك التشفير
كيف يعمل التشفير بالنسبة المئوية: من الأحرف إلى UTF-8 بايت إلى %XX تسلسلات
· كيف يعمل
ترميز URL أوتف-8 ترميز النسبة المئوية مطور
لا يقوم الترميز المئوي بتشفير الأحرف؛ يقوم بتشفير البايتات. يوضح هذا المنشور كيف يصبح الحرف UTF-8 بايت ثم أزواجًا سداسية عشرية، ولماذا يأخذ الحرف المميز مجموعتين %XX بينما يأخذ الرمز التعبيري أربع مجموعات.
لماذا يتحول 'é' إلى %C3%A9 بدلاً من %E9 — الملاحظة التي تكشف طبقة البايت الموجودة أسفلها
عندما يرى مطور مبتدئ %C3%A9 في URL، فإن ترميز النسبة المئوية يعمل على وحدات البايت، وليس الأحرف. الحرف é ليس بايت واحد؛ UTF-8 يشفرها على شكل اثنين: C3 A9. قاعدة ترميز النسبة المئوية من RFC 3986 بسيطة: قم بتشفير كل بايت كعلامة نسبة مئوية متبوعة برقمين سداسي عشري. وهذا التمييز يحول التفسير من غامض إلى منطقي.
يتطلب فهم ترميز النسبة المئوية فهم UTF-8. يجب تحويل النص إلى بايت باستخدام ترميز الأحرف. UTF-8 هو المعيار القياسي لعناوين URL والويب. وهو يعبر عن الأحرف كتسلسلات بايت متغيرة الطول: ASCII يستخدم بايت واحد، والأحرف المحركة تستخدم اثنين، والرموز التعبيرية تستخدم أربعة. تتميز كل مرحلة بأنها مميزة: الحرف، ونقطة رمز Unicode، وUTF-8 بايت، ثم %XX من الأزواج. إن التخطي إلى النظام السداسي دون فهم وحدات البايت يخطئ الهدف.
قاعدة الترميز المئوية من RFC 3986 — واحد % متبوعًا برقمين سداسي عشريين لكل بايت، ويفضل استخدام الأحرف الكبيرة
RFC 3986 يحدد قاعدة واحدة: تشفير كل بايت كنسبة مئوية متبوعة برقمين سداسي عشري كبير. الأحرف غير المحفوظة التي لا تحتاج إلى أي تشفير هي الأحرف والأرقام والواصلة والشرطة السفلية والنقطة والتيلدا. كل شيء آخر يجب أن يكون مشفرة. تصبح المسافات %20، وتصبح الخطوط المائلة %2F، وتصبح علامة النسبة المئوية %25. يمنع هذا الأحرف الخاصة في قيم الاستعلام من كسر بنية URL.
يتم ترميز المسافة بالبايت 0x20، لتصبح %20. الشرطة المائلة للأمام هي 0x2F، لتصبح %2F. هذه ASCII من الأحرف تحتاج إلى بايت واحد. تختلف الحروف المحركة والرموز التعبيرية. تصبح علامة النسبة %25. يتم ترميز المحددات المحجوزة مثل النقطتين للحفاظ على البنية. يمنع هذا علامة الضم المضمنة أو يساوي في معلمة استعلام من كسر التحليل. يصبح كل بايت %HH.
UTF-8 باعتبارها مجموعة الأحرف المفترضة - لماذا تكون عناوين URL الحديثة UTF-8 ومكان وجود الاستثناءات القديمة
UTF-8 يستخدم تشفيرًا متغير الطول. ASCII من نقاط الرمز 0 إلى 127 هي بايت واحد. يبلغ حجم الأحرف من 128 إلى 2047، بما في ذلك الحروف اللاتينية المميزة، وحدتي بايت. الأحرف من 2048 إلى 65535، الشائعة في البرامج النصية لشرق آسيا، هي ثلاث بايت. يبلغ حجم الأحرف الموجودة أعلى 65535، بما في ذلك معظم الرموز التعبيرية، أربعة بايت. تكون كل بايت مسبوقة ببتات تشير إلى عدد البايتات التي تتبعها.
الحرف المميز é هو نقطة ترميز Unicode U+00E9. يقوم UTF-8 بترميزه على هيئة بايتتين: 0xC3 و0xA9. ينتج عن ترميز النسبة المئوية %C3%A9. الألمانية ü (U+00FC) يتم ترميزها كـ 0xC3 0xBC، لتصبح %C3%BC. الإسبانية ñ (U+00F1) يتم ترميزها كـ 0xC3 0xB1، لتصبح %C3%B1. النمط ثابت: البايت الأول يشير إلى تسلسل ثنائي البايت. يتم توسيع حرف واحد معلمة بمقدار ستة أحرف في الترميز.
مثال عملي: ترميز 'café 😀' بايت بايت — نقاط الكود، وUTF-8 بايت والسلسلة الناتجة
الرموز التعبيرية تجعل طبقة البايت واضحة. رمز الإبهام 👍 هو النقطة الرمزية U+1F44D. UTF-8 يقوم بتشفيره كأربعة بايت: F0 9F 91 8D. ينتج عن الترميز المئوي %F0%9F%918D: اثني عشر حرفًا لرمز واحد. يتم ترميز الوجه المبتسم 😀 (U+1F600) كـ F0 9F 98 80، ليصبح %F0%9F%9880. تصبح التسلسلات المكونة من أربعة بايت اثني عشر حرفًا مشفرًا بنسبة مئوية.
يُظهر النص المختلط أهمية فهم وحدات البايت. تحتوي عبارة "café 😀" على ASCII عادي ولهجة ورمز تعبيري. يتم ترميز الأحرف c وa وf كـ 63، 61، 66. يتم ترميز é كـ C3 A9. يتم ترميز المسافة كـ 20. يتم ترميز الرموز التعبيرية كـ F0 9F 98 80. والنتيجة هي "caf%C3%A9%20%F0%9F%9880". إن فهم البايتات التي تحتاج إلى تشفير يجعل الإخراج قابلاً للتنبؤ به.
فك التشفير بشكل عكسي - تجميع %XX من المجموعات إلى بايت ثم تفسيرها على أنها UTF-8
فك التشفير يعكس العملية. يقوم جهاز فك التشفير بمسح أزواج %XX ويجمعها في قيم بايت. رؤية %C3%A9، فإنه يستخرج البايتات C3 وA9. يفسر فك التشفير UTF-8 تلك الحروف على أنها الحرف é. إذا كان التسلسل غير مكتمل، مثل %C3 وحده، فستكون النتيجة خطأ. يعرف جهاز فك التشفير من بتات البادئة UTF-8 أن C3 يتطلب بايتًا ثانيًا.
لا يهم حالة الأحرف بالأرقام السداسية؛ يتم فك تشفير %C3%A9 و%c3%a9 بشكل مماثل. RFC يسمح باستخدام الأحرف الكبيرة أو الصغيرة، على الرغم من تفضيل الأحرف الكبيرة. لكن حالة الأحرف مهمة بالنسبة للأحرف: é (مثل %C3%A9) ليست هي نفسها É (مثل %C3%89). يجب أن تؤدي مقارنة URL إلى تسوية نسبة الترميز المئوية أو المخاطرة بمعاملة الموارد المتطابقة على أنها مختلفة. تطبيع الأطر قبل التخزين المؤقت.
لماذا لا تهم حالة الأحرف في الأرقام السداسية ولكنها مهمة في أي مكان آخر - قواعد التطبيع ومقارنة URL
RFC 3986 يذكر punycode لأسماء النطاقات وترميز النماذج لعمليات الإرسال كقواعد منفصلة. يقوم Punycode بترميز أسماء النطاقات غير ASCII بدون علامات النسبة المئوية للتوافق DNS. المجال 😀.example يصبح "xn--js8h.example". يعدل ترميز النموذج ترميز النسبة المئوية مع استثناء واحد: تصبح المسافات علامات زائد بدلاً من %20. النماذج المرسلة كتطبيق /x-www-form-urlencoded تستخدم علامة الجمع للمسافات.
تعرض أداة التشفير URL الأوضاع الثلاثة: تشفير المكون، وترميز URL بالكامل، وترميز النموذج. يقوم تشفير المكون باستخدام encodeURIComponent بتشفير كل حرف خاص بما في ذلك المحددات المناسبة لقيم الاستعلام. يحافظ ترميز Whole-URL باستخدام encodeURI على الأحرف الهيكلية لعناوين URL الكاملة. تشفير النموذج مخصص للأجسام POST. يستخدم كل منهما UTF-8؛ وهي تختلف فقط في عدد البايتات التي تُركت غير مشفرة.
Punycode وترميز النماذج: معايير الأخوة، وليس امتدادات ترميز النسبة المئوية
منظور البايت يحل ألغاز URL. لماذا يحتاج الرمز التعبيري الواحد إلى اثني عشر حرفًا؟ لأن UTF-8 يستخدم أربعة بايتات، كل منها يصبح %HH. لماذا تحتوي بعض عناوين URL على %2F للخطوط المائلة بينما تحتوي عناوين URL الأخرى على خطوط مائلة عادية؟ لأن وضع التشفير يقرر: تظل الشرطة المائلة في مقطع المسار غير مشفرة، ولكن داخل قيمة الاستعلام يجب أن تكون %2F لتجنب القراءة الخاطئة.
فكر في وحدات البايت من أجل ترميز النسبة المئوية الذي يمكن التنبؤ به. الحرف هو نقطة رمز Unicode. UTF-8 هو تمثيل البايت الخاص به. ترميز النسبة المئوية هو تنسيق الإرسال. يحدث توسيع الأحرف في الطبقة UTF-8. لا تؤثر الحالة السداسية على فك التشفير ولكن حالة الأحرف تؤثر. تفشل تسلسلات البايت غير الصالحة عند UTF-8 بسبب قواعد البادئة الصارمة. تُظهر أداة التشفير URL هذا التقدم.
الوجبات الجاهزة: فكر بالبايت - كيف يعرض برنامج التشفير ووحدة فك التشفير URL إخراج %XX الدقيق لأي نص تلصقه، في المتصفح
مثال عملي: ترميز "café 😀". تحتوي كلمة "مقهى" على الحروف c وa وf مثل ASCII بايت مفرد: 63، 61، 66. é هو UTF-8 بايتين: C3 A9. المساحة 20. الرموز التعبيرية 😀 هي أربع بايت: F0 9F 98 80. تظل رسائل ASCII غير المحفوظة مرئية. النتيجة: "caf%C3%A9%20%F0%9F%9880". يوضح هذا سبب توسع رمز تعبيري واحد إلى اثني عشر حرفًا.
الوجبات الجاهزة: فكر بالبايت، وليس الأحرف. يتم تطبيق التشفير بالنسبة المئوية بعد تشفير UTF-8. يصبح كل بايت %HH. الطول المتغير UTF-8 يعني أن الأحرف تتوسع بشكل مختلف: ASCII تصبح %XX (حرفين)، وتصبح العلامات ثنائية البايت %XX%XX (ستة أحرف)، وتصبح الرموز التعبيرية ذات أربعة بايت %XX%XX%XX%XX (اثني عشر حرفًا). الصق النص في أداة التشفير URL ولاحظ التقدم.