ترميز Base64
7 أدوات
ما هو الترميز؟
الترميز هو عملية تحويل البيانات من تمثيل إلى آخر. في تطوير الويب، يُستخدم الترميز لنقل البيانات بأمان عبر قنوات صُممت لمجموعة محدودة من المحارف — مثلاً، إرسال بيانات ثنائية عبر بروتوكول نصي، أو تضمين محارف خاصة في URL.
ترميز المحارف يحدد كيفية تعيين محارف النص إلى بايتات. ترميز Base64 يحوّل البيانات الثنائية إلى نص ASCII. ترميز URL يجعل النص العشوائي آمناً للاستخدام في عناوين URL. فهم هذه الطبقات الثلاث من الترميز يمنع الأخطاء الدقيقة وثغرات الأمان.
تاريخ ترميز المحارف
ترميز المحارف هو الربط بين المحارف (الحروف والرموز) وتمثيلاتها الثنائية. يعكس التطور من ASCII إلى Unicode انتشار الويب على مستوى العالم:
الرمز الأمريكي المعياري ذو 7 بت. 128 محرفاً: حروف إنجليزية وأرقام وعلامات ترقيم ورموز تحكم. وضع الأساس الذي يمتد عليه كل ترميز آخر.
ASCII الموسّع للغات أوروبا الغربية. أضاف 128 محرفاً (حروف بعلامات تشكيل ورموز). غير مناسب للخطوط غير اللاتينية.
مجموعة المحارف العالمية التي تغطي جميع أنظمة الكتابة في العالم. تُعرّف نقاط كود لأكثر من 149,000 محرف عبر 161 خطاً. لا تُحدد الترميز — ذلك هو دور UTF-8/16/32.
ترميز متغير العرض لـ Unicode يستخدم 1–4 بايت لكل محرف. متوافق مع ASCII (أول 128 نقطة كود تُشفَّر في بايت واحد). الترميز السائد على الويب — أكثر من 98% من المواقع.
ترميز متغير العرض يستخدم 2 أو 4 بايت لكل محرف. يُستخدم داخلياً في Windows وJava وسلاسل JavaScript. غير متوافق مع ASCII.
ترميز ثابت العرض: دائماً 4 بايت لكل محرف. بسيط لكنه يهدر المساحة. يُستخدم في بعض قواعد البيانات داخلياً. نادر الظهور على الويب.
لماذا انتصر UTF-8
أصبح UTF-8 الترميز المهيمن لأنه متوافق مع ASCII للأخلفية (أول 128 محرفاً تُشفَّر بالطريقة ذاتها)، ومزامن ذاتياً (يمكن إيجاد حدود المحارف عبر المسح)، وفعّال في استخدام المساحة للنصوص اللاتينية. أي مستند ASCII هو مستند UTF-8 صحيح، مما جعل الترحيل سلساً.
ترميز Base64
يحوّل Base64 البيانات الثنائية إلى تمثيل نصي باستخدام 64 محرفاً ASCII قابلاً للطباعة فقط: A-Z وa-z و0-9 و+ و/. هذا ضروري عندما يجب أن تنتقل البيانات الثنائية عبر قنوات تتعامل فقط مع النصوص — مرفقات البريد الإلكتروني وعناوين data URI وتوكنات JWT وHTTP Basic Auth جميعها تستخدم Base64.
كيف يعمل
يُقسّم Base64 البايتات المدخلة إلى مجموعات من 3 بايت (24 بت) ويُشفِّر كل مجموعة على هيئة 4 محارف Base64 (6 بت لكل منها). إذا لم يكن حجم المدخلات مضاعفاً للعدد 3، تُضاف محارف حشو = لإكمال المجموعة الأخيرة:
| المدخل | بايتات هيكساديسيمال | Base64 |
|---|---|---|
| "Man" | 77 61 6E | TWFu |
| "Ma" | 4D 61 | TWE= |
| "M" | 4D | TQ== |
تشير محارف الحشو = في النهاية إلى عدد البايتات الناقصة لإكمال مجموعة الـ 3 بايت الأخيرة. تعني = الواحدة أن بايتاً واحداً من الحشو كان ضرورياً؛ وتعني == أن بايتين كانا ضروريين. يُنتج Base64 القياسي دائماً مخرجات طولها مضاعف للعدد 4.
ترميز URL
يمكن أن تحتوي عناوين URL فقط على مجموعة محدودة من محارف ASCII الآمنة. أي محرف خارج هذه المجموعة — بما في ذلك المسافات وعلامات الترقيم والمحارف غير ASCII ومحارف URL الخاصة مثل & و= و# — يجب ترميزه بنظام النسبة المئوية (URL-encoded) قبل وضعه في URL.
يستبدل ترميز النسبة المئوية كل بايت غير آمن بالرمز % متبوعاً برقمين هيكساديسيماليين يمثلان قيمة ذلك البايت. تصبح المسافة %20، ورمز العطف %26، وهكذا.
المحارف الأكثر ترميزاً
| المحرف | المُرمَّز | ملاحظات |
|---|---|---|
| Space | %20 | الأكثر شيوعاً؛ يُستخدم في إرسال النماذج بوصفه + في application/x-www-form-urlencoded |
| & | %26 | فاصل سلسلة الاستعلام؛ يجب ترميزه عند استخدامه كقيمة حرفية |
| = | %3D | فاصل المفتاح والقيمة في سلاسل الاستعلام؛ يُرمَّز عند استخدامه كبيانات |
| + | %2B | يُفسَّر على أنه مسافة في application/x-www-form-urlencoded؛ يُرمَّز للحفاظ على الرمز + الحرفي |
| # | %23 | معرّف الجزء (fragment)؛ يُرمَّز عند استخدامه كبيانات حرفية في مسار أو استعلام |
| / | %2F | فاصل مقاطع المسار؛ يُرمَّز عند استخدامه كبيانات حرفية لا كمحدد مسار |
| : | %3A | فاصل المخطط (scheme)؛ يُرمَّز في سياقات المسار والاستعلام |
| @ | %40 | يُستخدم في mailto: والمصادقة؛ يُرمَّز عند استخدامه كبيانات حرفية |
encodeURI vs encodeURIComponent
يوفر JavaScript دالتَين للترميز بنطاقين مختلفين. تُرمِّز encodeURI عنوان URL كاملاً — وتترك المحارف ذات المعنى في عناوين URL (:، /، ?، #، @) دون ترميز. أما encodeURIComponent فتُرمِّز مكوّناً واحداً من URL (قيمة معامل استعلام أو مقطع مسار) — وتُرمِّز جميع المحارف باستثناء A-Z وa-z و0-9 و- و_ و. و~. استخدم دائماً encodeURIComponent للقيم الفردية وencodeURI لعناوين URL الكاملة.
أين يظهر الترميز في تطوير الويب
يُرمِّز ترويسة Authorization: Basic بيانات الاعتماد بصيغة Base64(username:password). هذا ترميز لراحة النقل، وليس أماناً — فـ Base64 قابل للعكس بسهولة تامة. استخدم HTTPS دائماً مع Basic Auth.
تُضمِّن Data URIs محتوى الملف مباشرةً في HTML أو CSS: data:image/png;base64,.... يُلغي ترميز الصور والخطوط بـ Base64 مباشرةً في الصفحة طلبات HTTP على حساب زيادة حجم المستند (نحو 33% زيادة).
صُمِّم البريد الإلكتروني في الأصل لـ ASCII ذي 7 بت. تُرمَّز المرفقات الثنائية (الصور وملفات PDF) بـ Base64 عبر MIME قبل الإرسال. يفك عميل البريد الترميزَ بشفافية عند عرض الرسالة.
تستخدم توكنات JWT ترميز Base64url (متغيِّر يستبدل + بـ - و/ بـ _، دون حشو) للأجزاء الثلاثة (الترويسة والحمولة والتوقيع). يجعل ذلك التوكنات آمنة للاستخدام في URL دون الحاجة إلى ترميز نسبة مئوية إضافي.
يجب ترميز أي بيانات يُدخلها المستخدم في سلاسل استعلام URL بالنسبة المئوية. إهمال ترميز & أو = داخل قيمة ما سيُفسد تحليل سلسلة الاستعلام بصمت. استخدم دائماً encodeURIComponent على القيم الفردية.
تُرمَّز أسماء النطاقات غير ASCII (مثل münchen.de) باستخدام Punycode (البادئة xn--) لضمان التوافق مع نظام DNS. يعرض المتصفح الشكل Unicode لكنه يرسل شكل Punycode إلى محللات DNS.
الأسئلة الشائعة
لا. Base64 هو ترميز وليس تشفيراً. إنه تحويل قابل للعكس ولا يستخدم مفتاحاً سرياً. يمكن لأي شخص يرى سلسلة Base64 فكّ ترميزها فوراً. لا تستخدم Base64 كإجراء أمني.
يعالج Base64 المدخلات في مجموعات من 3 بايت. إذا لم يكن حجم المدخلات مضاعفاً للعدد 3، يُضاف حشو = لإكمال المجموعة الأخيرة. تعني = الواحدة بايتاً واحداً من الحشو؛ وتعني == بايتين. بعض التطبيقات تحذف الحشو (كـ Base64url في JWT).
Base64url متغيِّر من Base64 آمن للاستخدام في URL، يستبدل + بـ - و/ بـ _، ويحذف عادةً حشو =. يجعل ذلك استخدامه في عناوين URL وترويسات HTTP آمناً دون ترميز نسبة مئوية. تستخدم JWT ترميز Base64url للأجزاء الثلاثة.
استخدم encodeURIComponent للقيم الفردية (قيم معاملات الاستعلام وقيم مقاطع المسار). استخدم encodeURI لسلسلة URL كاملة حين تريد الحفاظ على محارف بنية URL (/ و: و? و#). عند الشك، استخدم encodeURIComponent.
UTF-8 متوافق مع ASCII وفعّال في استخدام المساحة للنصوص اللاتينية (معظم عناوين URL وعلامات HTML والكود هي ASCII). يهدر UTF-16 المساحة لمحتوى ASCII وهو غير متوافق مع الإصدارات السابقة. يُستخدم UTF-8 افتراضياً في HTTP وHTML.
يُمثِّل ترميز النسبة المئوية (URL encoding) المحارفَ بالرمز % متبوعاً برقمين هيكساديسيماليين يمثلان قيمة البايت. مثلاً، المسافة هي %20 (القيمة العشرية 32، الهيكساديسيمالية 20). تُرمَّز محارف UTF-8 متعددة البايت كل بايت منها على حدة: é هي %C3%A9.
يزيد Base64 حجم البيانات بنحو 33% ويُضيف عبئاً على المعالج لعمليات الترميز وفك الترميز. في الأنظمة ذات الإنتاجية العالية، يُفضَّل استخدام البروتوكولات الثنائية. يُضيف ترميز URL عبئاً ضئيلاً لكنه قد يجعل عناوين URL أطول بشكل ملحوظ عند وجود محارف خاصة كثيرة.
Punycode هو ترميز لتمثيل محارف Unicode في نظام DNS المتوافق مع ASCII. تُرمَّز أسماء النطاقات الدولية مثل münchen.de على هيئة xn--mnchen-3ya.de في استعلامات DNS. تعرض المتصفحات الشكل Unicode لكنها تستخدم Punycode داخلياً.