سؤال

وجود مؤشر غير معد يشير إلى بعض العازلة التي يمكن أن تحمل إما ansi أو unicode سلسلة ، كيف يمكنني أن أخبر ما إذا كانت السلسلة الحالية التي تحملها هي متعددة أو لا؟

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

المحلول

ما لم تحتوي السلسلة نفسها على معلومات حول تنسيقها (مثل رأس أو علامة أمر بايت) ثم لا توجد طريقة مضمونة لاكتشاف ما إذا كانت السلسلة ANSI أو Unicode. يتضمن واجهة برمجة تطبيقات Windows وظيفة تسمى IsTextUnicode() أن التخمين في الأساس إذا كانت السلسلة هي ANSI أو Unicode ، ولكن ثم تصادف هذه المشكلة لأنك أجبر على التخمين.

لماذا لديك مؤشر غير معد لسلسلة في المقام الأول؟ يجب أن تعرف بالضبط ما وكيف تمثل بياناتك المعلومات ، إما باستخدام مؤشر مكتوب في المقام الأول أو توفير علامة ANSI/Unicode أو شيء من هذا القبيل. سلسلة من البايتات لا معنى لها إلا إذا كنت تعرف بالضبط ما تمثله.

نصائح أخرى

Unicode هو ليس تشفير ، إنه رسم خرائط للرمز إلى الأحرف. ال التشفير IS UTF8 أو UCS2 ، على سبيل المثال.

وبالنظر إلى أن هناك صفر الفرق بين ASCII و UTF8 الترميز إذا قمت بتقييد نفسك على 128 حرفًا أقل ، لا يمكنك بالفعل معرفة الفرق.

من الأفضل أن تسأل عما إذا كانت هناك طريقة لمعرفة الفرق بين ASCII وترميز معين من Unicode. والإجابة على ذلك هي استخدام التحليل الإحصائي ، مع إمكانية عدم الدقة.

على سبيل المثال ، إذا كانت السلسلة بأكملها تتكون من بايت أقل من 128 ، فهي ASCII ( استطاع كن UTF8 ولكن لا توجد طريقة لمعرفة ولا فرق في هذه الحالة).

إذا كانت اللغة الإنجليزية/الرومانية في المقام الأول وتتكون من الكثير من التسلسلات ثنائية البايت مع صفر كواحد من البايتات ، فمن المحتمل أن يكون UTF16. وهلم جرا. لا أعتقد أن هناك طريقة مضمونة دون وجود مؤشر من نوع ما (على سبيل المثال ، BOM).

اقتراحي هو عدم وضع نفسك في الموضع الذي يجب أن تخمنه. إذا كان نوع البيانات نفسه لا يمكن أن يحتوي على مؤشر ، فوفر وظائف مختلفة لـ ASCII وترميز معين من Unicode. ثم إجبار عمل اتخاذ قرار بشأن عميلك. في مرحلة ما من التسلسل الهرمي ، شخصا ما يجب الآن الترميز.

أو الأفضل من ذلك ، التخلص من ASCII تمامًا ، احتضن العالم الجديد واستخدام Unicode حصريًا. مع ترميز UTF8 ، لدى ASCII بالضبط رقم المزايا على Unicode :-)

بشكل عام لا يمكنك ذلك

يمكنك التحقق من نمط الأصفار - ربما يعني واحد فقط في النهاية ANSI 'c' ، وربما يعني كل بايت آخر ZERO نص ANSI مثل UTF16 ، 3zeros قد يكون UTF32

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