سؤال

يبدو أن هناك غموضًا بين علامات ترتيب البايت المستخدمة لـ UTF16-LE وUTF-32LE.على وجه الخصوص، فكر في ملف يحتوي على البايتات الثمانية التالية:

FF FE 00 00 00 00 00 00

كيف يمكنني معرفة ما إذا كان هذا الملف يحتوي على:

  1. UTF16-LE BOM (FF FE) متبوعًا بثلاثة أحرف فارغة؛أو
  2. UTF32-LE BOM (FF FE 00 00) متبوعًا بحرف واحد فارغ؟

يتم وصف Unicode BOMs هنا: http://unicode.org/faq/utf_bom.html#bom4 لكن لا يوجد نقاش حول هذا الغموض.هل فاتني شيء؟

هل كانت مفيدة؟

المحلول

كما يوحي الاسم، يخبرك BOM فقط بما يلي ترتيب البايت, ، وليس الترميز.عليك أن تعرف ما هو التشفير أولاً، ثم يمكنك استخدام BOM لتحديد ما إذا كانت البايتات الأقل أو الأكثر أهمية هي الأولى للتسلسلات متعددة البايت.

أحد الآثار الجانبية المحظوظة لـ BOM هو أنه يمكنك أيضًا استخدامه في بعض الأحيان لتخمين التشفير إذا كنت لا تعرفه، ولكن هذا ليس ما تم تصميمه من أجله وليس بديلاً عن إرسال معلومات التشفير المناسبة.

نصائح أخرى

إنه لا لبس فيه. FF FE مخصص لـ UTF-16LE و FF FE 00 00 يدل على UTF-32LE.ليس هناك سبب للاعتقاد بذلك FF FE 00 00 من المحتمل أن يكون UTF-16LE نظرًا لأن UTFs تم تصميمها للنص، ويجب ألا يستخدم المستخدمون أحرف NUL في نصهم.بعد كل شيء، متى كانت آخر مرة قمت فيها بفتح محرر سداسي عشري وأدخلت بضعة بايتات من 00 في مستند نصي؟^_^

لقد واجهت نفس المشكلة مثل إدوارد.وأنا أتفق مع داستن، عادةً لن يستخدم أحد الأحرف الخالية في الملفات النصية.

ومع ذلك فقد قمت بإنشاء ملف يحتوي على جميع أحرف Unicode.لقد استخدمت أولاً ترميز utf-32le، ثم ترميز utf-32be، وترميز utf-16le وترميز utf-16be بالإضافة إلى ترميز utf-8.

عند محاولة إعادة ترميز الملفات إلى utf-8، أردت مقارنة النتيجة بملف utf-8 الموجود بالفعل.نظرًا لأن الحرف الأول في ملفاتي بعد BOM هو الحرف الفارغ، لم أتمكن من اكتشاف الملف باستخدام utf-16le BOM بنجاح، فقد ظهر كـ utf-32le BOM، لأن البايتات ظهرت تمامًا كما وصفها إدوارد.الحرف الأول بعد BOM FFFE هو 0000، لكن اكتشاف BOM عثر على BOM FFFE0000 وهكذا، اكتشف utf-32le بدلاً من utf-16le حيث تمت سرقة أول حرف مكون من 0000 وتم أخذه كجزء من BOM.

لذلك لا ينبغي لأحد أبدًا استخدام حرف فارغ كحرف أول لملف مشفر باستخدام utf-16 endian الصغير، لأنه سيجعل utf-16le وutf-32le BOM غامضين.

لحل مشكلتي، سأقوم بتبديل الحرف الأول والثاني.:-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top