العربية

أدوات المطور · التشفير ووحدة فك التشفير Base64

لماذا يتم استخدام btoa() على الرموز التعبيرية وكيفية تشفير Base64 UTF-8 في JavaScript

· كيف يعمل

base64 يونيكود ترميز

تم تحويل أحرف Unicode إلى UTF-8 بايت قبل تشفير Base64
الرسم التوضيحي المتجه الأصلي ToolAcre

btoa() يقبل فقط الأحرف التي تصل إلى U+00FF، لذا فإن النص المميز وCJK ورمي الرموز التعبيرية. يوضح هذا المنشور ما تتوقعه الوظيفة فعليًا وكيف يحصل لك TextEncoder على سلسلة UTF-8 Base64 الصحيحة.

لماذا يمكن لـ btoa استخدام Unicode — وخطأ في تشفير اللهجة بصمت

يؤدي استدعاء btoa("😀") إلى ظهور خطأ InvalidCharacterError لأن الرموز التعبيرية لا يمكن احتواؤها في وحدة رمز بحجم بايت واحد. الخطأ الأكثر دقة هو btoa("é"): é المركبة مسبقًا هي U+00E9، أسفل 256، لذلك يقبلها btoa ولكنه يشفر اللاتينية-1 byte E9، وليس UTF-8 بايت C3 A9. نفس اللكنة المرئية المكتوبة كـ e بالإضافة إلى علامة الدمج يمكن أن ترمي لأن العلامة خارج النطاق المقبول. يحتاج الاختصار "إلقاء اللكنة" في المصنف إلى هذا المؤهل: يمكن أن تفشل السلسلة بصوت عالٍ أو تنتج البايتات الخاطئة بهدوء.

ما الذي يشفره btoa() حقًا: سلسلة ثنائية من وحدات التعليمات البرمجية 0–255 - لماذا تم تصميم الوظيفة حول اللاتينية - 1 bytes بدلاً من نص Unicode

يستهلك btoa "سلسلة ثنائية": يجب أن تكون كل وحدة رمز أحرف JavaScript في النطاق 0–255 وترمز إلى بايت واحد. لا يفهم ترميز نص Unicode أو اللغة أو التطبيع. يتم تمثيل الرموز التعبيرية النجمية بوحدتي كود بديلتين UTF-16، وكلاهما أكبر بكثير من 255، لذا فإن إرسال السلسلة JavaScript الأولية مباشرة لا يمكن أن ينجح. تعامل مع الإخراج على أنه ترميز للبايتات، وليس للأحرف المجردة.

UTF-8 أولاً، Base64 ثانيًا - لماذا يجب أن يتحول النص إلى بايت قبل تطبيق أي أبجدية Base64

يقوم TextEncoder بتحويل السلسلة JavaScript إلى تسلسل البايت UTF-8 الخاص بها أولاً. ثم قم بتحويل كل بايت إلى حرف سلسلة ثنائية وقم بتمرير تلك السلسلة الثنائية إلى btoa، أو استخدم API آخر يقبل البايتات مباشرة. لفك التشفير، تقوم atob بإرجاع السلسلة الثنائية؛ قم باستعادة قيم البايت الخاصة بها ومنحها إلى TextDecoder("utf-8"). يستخدم ToolAcre وحدة فك ترميز صارمة ترفض UTF-8 بدلاً من إدخال أحرف بديلة بصمت.

مثال عملي: تشفير 'café 😀' باستخدام TextEncoder وbtoa - تسلسل البايت والسلسلة الثنائية الوسيطة والمخرج النهائي

بالنسبة لمقهى النص الحرفي 😀، فإن البايتات UTF-8 هي 63 61 66 C3 A9 20 F0 9F 98 80 بالنظام الست عشري: ASCII c-a-f، وحدتا بايت لـ é، ومسافة وأربعة بايت للرموز التعبيرية. Base64 من هذه البايتات العشرة هو Y2Fmw6kg8J+YgA==. تصف المساحة المتروكة والأبجدية البايتات فقط؛ لا يقومون بتسمية اللغة. قارن فشل btoa("café 😀") المباشر مع وضع UTF-8 الخاص بـ ToolAcre، ثم قم بفك تشفير النتيجة وتحقق من بقاء نفس اللهجة المرئية والرموز التعبيرية.

خدعة unescape(encodeURIComponent()) القديمة وسبب اعتبارها اختراقًا - ما الذي تفعله تحت الغطاء ولماذا لا يتم تشجيعها

الحل التاريخي هو btoa(unescape(encodeURIComponent(text))). يقوم encodeURIComponent بتشفير النسبة المئوية UTF-8 ويقوم unescape بإعادة حزم النسبة المئوية الثلاثية كوحدات رمز مفردة، ولكن تم إهمال unescape، ومن الصعب قراءته ومربك حول البدائل المنفردة المشوهة. فهو يجعل التحويل يبدو وكأنه معالجة URL حتى في حالة عدم وجود URL. يوضح TextEncoder الحدود المقصودة بوضوح: يصبح النص بايتًا مرة واحدة، ويعمل Base64 فقط بعد ذلك.

فك التشفير على الجانب الآخر - إقران atob مع TextDecoder بحيث تكون الرحلة ذهابًا وإيابًا بلا خسارة

بعد atob، لا تستدعي decodeURIComponent على وحدات البايت الثنائية العشوائية وتأمل أن تصبح نصًا. قم بتحويل رموز الأحرف إلى Uint8Array وتمريرها عبر TextDecoder. في مثال المقهى 😀 النتيجة هي التسلسل الأصلي ذو العشرة بايت UTF-8، ثم السلسلة الأصلية. إذا تم فك تشفير Base64 إلى بايت صورة أو ملف مضغوط، فقد لا يمثل نصًا صالحًا UTF-8 على الإطلاق؛ تشير ToolAcre إلى أنه بدلاً من التظاهر بأن البيانات الثنائية هي نثر قابل للقراءة.

ما لا يغطيه هذا هو تشفير الملفات والثنائي الثنائي ومتغيرات base64url وتدفق المدخلات الكبيرة

يتعلق هذا الشرح بالنص المشفر كـ UTF-8. يحتوي الملف وBlob Base64 وBase64url لمقاطع JWT والتشفير المتزايد للبيانات متعددة الجيجابايت على واجهات أو احتياجات ذاكرة مختلفة. لا يقوم Base64 أيضًا بتشفير الرمز المميز: يمكن لأي شخص يحمله فك تشفير البايتات. يمكن لوحدة فك التشفير قبول الحشو والمسافات البيضاء المفقودة الشائعة، لكن قابلية التشغيل البيني لا تزال تعتمد على معرفة ما إذا كانت الحمولة عبارة عن نص أو بيانات ثنائية عشوائية.

الوجبات الجاهزة: قم بتشفير البايتات، وليس السلاسل، وتحقق من الرحلة ذهابًا وإيابًا - كيف يقوم برنامج التشفير ووحدة فك التشفير Base64 بالخطوة UTF-8 بالنسبة لك حتى تظل اللكنات وCJK والرموز التعبيرية على قيد الحياة

قم بتشفير البايتات، وليس سلاسل JavaScript الأولية، ثم تحقق من الرحلة ذهابًا وإيابًا. يقوم برنامج التشفير ووحدة فك التشفير Base64 بتنفيذ خطوات TextEncoder وTextDecoder لك مع الاحتفاظ بالنص الملصق في المتصفح. RFC 4648 يحدد الحروف الأبجدية والحشو؛ يوفر UTF-8 العقد المنفصل من حرف إلى بايت. يعد خلط هاتين الطبقتين هو السبب الجذري لكل من InvalidCharacterError والفساد اللاتيني الهادئ 1.