Base64 وUTF-8: تشخيص النص الصيني والرموز التعبيرية والأحرف البديلة

تتبّع النص عبر Unicode وبايتات UTF-8، وميّز أخطاء فك الترميز عن التطبيع، واحتفظ بالمدخلات الثنائية غير الصالحة.

عندما يظهر Base64 وكأنه "يكسر اللغة الصينية"، تكون المشكلة عادةً هي الحد بين الأحرف والبايتات. Base64 لا يعرف أن التسلسل يمثل نصًا صينيًا أو رمزًا تعبيريًا. يحفظ البايتات. يختار التطبيق كيفية إنتاج تلك البايتات وتفسيرها.

اتبع البايتات

الحرف 中 هو U+4E2D. في UTF-8 يستخدم البايتات E4 B8 AD، والتي يكون تمثيلها Base64 هو 5Lit. ينتج عن ترميز أحرف مختلف وحدات بايت مختلفة وبالتالي قيمة Base64 مختلفة. اتفق على UTF-8 من كلا الطرفين قبل مقارنة السلاسل المشفرة.

const bytes = new TextEncoder().encode('中');
console.log([...bytes]); // [228, 184, 173]
console.log([...bytes].map(b => b.toString(16)).join(' ')); // e4 b8 ad

توضح الرموز التعبيرية تمييزًا آخر: JavaScript '😊'.length عبارة عن وحدتي كود UTF-16، في حين أن تمثيلها UTF-8 يحتوي على أربع بايتات. لا يمثل أي من الرقمين وحدهما عددًا من الأحرف المرئية التي يدركها المستخدم في نص عشوائي. استخدم طول البايت لحسابات الملفات والنقل.

اجعل الاستبدال مرئيًا

قد يعني الحرف البديل � أن وحدة فك ترميز سابقة قد فقدت معلومات بالفعل. بمجرد استبدال وحدات البايت غير المعروفة في سلسلة ما وإعادة تشفير هذه السلسلة، لا يمكن إعادة بناء القيم الأصلية بشكل عام. افحص مصفوفة البايتات الأولية التي تم فك تشفيرها قبل إجراء المزيد من التحويلات.

const decoder = new TextDecoder('utf-8', { fatal: true });
console.log(decoder.decode(Uint8Array.of(0xe4, 0xb8, 0xad))); // 中
try { decoder.decode(Uint8Array.of(0xff)); }
catch { console.log('Invalid UTF-8; preserve the original byte.'); }

التطبيع هو عملية منفصلة

يمكن أن تبدو سلسلتان متطابقتين بينما تحتويان على تسلسلات Unicode مختلفة. قد يكون الحرف é حرفًا مركبًا مسبقًا أو حرف e متبوعًا بلكنة مجمعة. UTF-8 وBase64 يحافظان على هذا الاختلاف بشكل صحيح. إذا كان التطبيق الخاص بك يريد نصًا تمت تسويته، فاختر نموذج تسوية بشكل صريح وقم بتطبيقه قبل الترميز؛ لا تستدعي أبدًا نتيجة تم تغييرها إصلاحًا يحافظ على البايت.

تحقق أيضًا من الأحرف غير المرئية ونهايات الأسطر وعلامة ترتيب البايت المحتملة عندما تختلف النتائج. هذه بايتات إدخال حقيقية، وليست بالضرورة أخطاء في التشفير. بالنسبة للرسائل الموقعة والمجاميع الاختبارية، حتى الاختلاف غير المرئي يغير النتيجة.

الأمر الموثوق لاستكشاف الأخطاء وإصلاحها هو: الحفاظ على المصدر، وفحص البايتات، وتحديد ترميز الأحرف المتوقع، وفك التشفير مع معالجة الأخطاء الصريحة، وعندها فقط فكر في التطبيع. MDN: بتوا () يشرح سبب كون مكالمات btoa المباشرة للمتصفح غير مناسبة لنص Unicode التعسفي. يجب أن تتجاوز الملفات الثنائية فك تشفير النص بالكامل.