ToolDeck

ترميز Base64

7 أدوات

ما هو الترميز؟

الترميز هو عملية تحويل البيانات من تمثيل إلى آخر. في تطوير الويب، يُستخدم الترميز لنقل البيانات بأمان عبر قنوات صُممت لمجموعة محدودة من المحارف — مثلاً، إرسال بيانات ثنائية عبر بروتوكول نصي، أو تضمين محارف خاصة في URL.

ترميز المحارف يحدد كيفية تعيين محارف النص إلى بايتات. ترميز Base64 يحوّل البيانات الثنائية إلى نص ASCII. ترميز URL يجعل النص العشوائي آمناً للاستخدام في عناوين URL. فهم هذه الطبقات الثلاث من الترميز يمنع الأخطاء الدقيقة وثغرات الأمان.

تاريخ ترميز المحارف

ترميز المحارف هو الربط بين المحارف (الحروف والرموز) وتمثيلاتها الثنائية. يعكس التطور من ASCII إلى Unicode انتشار الويب على مستوى العالم:

ASCII1963
128 محرف

الرمز الأمريكي المعياري ذو 7 بت. 128 محرفاً: حروف إنجليزية وأرقام وعلامات ترقيم ورموز تحكم. وضع الأساس الذي يمتد عليه كل ترميز آخر.

Latin-11987
256 محرف

ASCII الموسّع للغات أوروبا الغربية. أضاف 128 محرفاً (حروف بعلامات تشكيل ورموز). غير مناسب للخطوط غير اللاتينية.

Unicode1991
149 186+ محرف

مجموعة المحارف العالمية التي تغطي جميع أنظمة الكتابة في العالم. تُعرّف نقاط كود لأكثر من 149,000 محرف عبر 161 خطاً. لا تُحدد الترميز — ذلك هو دور UTF-8/16/32.

UTF-81993
كل Unicode محرف

ترميز متغير العرض لـ Unicode يستخدم 1–4 بايت لكل محرف. متوافق مع ASCII (أول 128 نقطة كود تُشفَّر في بايت واحد). الترميز السائد على الويب — أكثر من 98% من المواقع.

UTF-161996
كل Unicode محرف

ترميز متغير العرض يستخدم 2 أو 4 بايت لكل محرف. يُستخدم داخلياً في Windows وJava وسلاسل JavaScript. غير متوافق مع ASCII.

UTF-322000
كل Unicode محرف

ترميز ثابت العرض: دائماً 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 6ETWFu
"Ma"4D 61TWE=
"M"4DTQ==

تشير محارف الحشو = في النهاية إلى عدد البايتات الناقصة لإكمال مجموعة الـ 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 الكاملة.

أين يظهر الترميز في تطوير الويب

مصادقة HTTP الأساسية

يُرمِّز ترويسة Authorization: Basic بيانات الاعتماد بصيغة Base64(username:password). هذا ترميز لراحة النقل، وليس أماناً — فـ Base64 قابل للعكس بسهولة تامة. استخدم HTTPS دائماً مع Basic Auth.

Data URI

تُضمِّن Data URIs محتوى الملف مباشرةً في HTML أو CSS: data:image/png;base64,.... يُلغي ترميز الصور والخطوط بـ Base64 مباشرةً في الصفحة طلبات HTTP على حساب زيادة حجم المستند (نحو 33% زيادة).

مرفقات البريد عبر MIME

صُمِّم البريد الإلكتروني في الأصل لـ ASCII ذي 7 بت. تُرمَّز المرفقات الثنائية (الصور وملفات PDF) بـ Base64 عبر MIME قبل الإرسال. يفك عميل البريد الترميزَ بشفافية عند عرض الرسالة.

توكنات JWT

تستخدم توكنات JWT ترميز Base64url (متغيِّر يستبدل + بـ - و/ بـ _، دون حشو) للأجزاء الثلاثة (الترويسة والحمولة والتوقيع). يجعل ذلك التوكنات آمنة للاستخدام في URL دون الحاجة إلى ترميز نسبة مئوية إضافي.

معاملات سلسلة الاستعلام

يجب ترميز أي بيانات يُدخلها المستخدم في سلاسل استعلام URL بالنسبة المئوية. إهمال ترميز & أو = داخل قيمة ما سيُفسد تحليل سلسلة الاستعلام بصمت. استخدم دائماً encodeURIComponent على القيم الفردية.

أسماء النطاقات الدولية

تُرمَّز أسماء النطاقات غير ASCII (مثل münchen.de) باستخدام Punycode (البادئة xn--) لضمان التوافق مع نظام DNS. يعرض المتصفح الشكل Unicode لكنه يرسل شكل Punycode إلى محللات DNS.

الأسئلة الشائعة

هل Base64 نوع من التشفير؟

لا. Base64 هو ترميز وليس تشفيراً. إنه تحويل قابل للعكس ولا يستخدم مفتاحاً سرياً. يمكن لأي شخص يرى سلسلة Base64 فكّ ترميزها فوراً. لا تستخدم Base64 كإجراء أمني.

لماذا تنتهي مخرجات Base64 بـ == أحياناً؟

يعالج Base64 المدخلات في مجموعات من 3 بايت. إذا لم يكن حجم المدخلات مضاعفاً للعدد 3، يُضاف حشو = لإكمال المجموعة الأخيرة. تعني = الواحدة بايتاً واحداً من الحشو؛ وتعني == بايتين. بعض التطبيقات تحذف الحشو (كـ Base64url في JWT).

ما الفرق بين Base64 وBase64url؟

Base64url متغيِّر من Base64 آمن للاستخدام في URL، يستبدل + بـ - و/ بـ _، ويحذف عادةً حشو =. يجعل ذلك استخدامه في عناوين URL وترويسات HTTP آمناً دون ترميز نسبة مئوية. تستخدم JWT ترميز Base64url للأجزاء الثلاثة.

متى يجب استخدام encodeURI بدلاً من encodeURIComponent؟

استخدم encodeURIComponent للقيم الفردية (قيم معاملات الاستعلام وقيم مقاطع المسار). استخدم encodeURI لسلسلة URL كاملة حين تريد الحفاظ على محارف بنية URL (/ و: و? و#). عند الشك، استخدم encodeURIComponent.

لماذا يُفضَّل UTF-8 على UTF-16 للويب؟

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؟

Punycode هو ترميز لتمثيل محارف Unicode في نظام DNS المتوافق مع ASCII. تُرمَّز أسماء النطاقات الدولية مثل münchen.de على هيئة xn--mnchen-3ya.de في استعلامات DNS. تعرض المتصفحات الشكل Unicode لكنها تستخدم Punycode داخلياً.