نوع المشروع C ++: Unicode vs Multii-Blete ؛ إيجابيات وسلبيات

StackOverflow https://stackoverflow.com/questions/3064052

  •  28-09-2019
  •  | 
  •  

سؤال

أتساءل عن رأي مجتمع الفائض في المكدس عندما يتعلق الأمر بإنشاء مشروع (التفكير في المقام الأول C ++ هنا) مع مجموعة أحرف Unicode أو مجموعة متعددة البايت.

  • هل هناك إيجابيات للذهاب إلى Unicode مباشرة من البداية ، مما يعني أن جميع الأوتار الخاصة بك ستكون في شكل واسع؟ هل هناك مشكلات في الأداء / متطلبات الذاكرة الأكبر بسبب الاستخدام القياسي لشخصية أكبر؟

  • هل هناك ميزة لهذه الطريقة؟ هل تتعامل بعض بنية المعالجات مع أحرف واسعة؟

  • هل هناك أي أسباب لجعل مشروعك Unicode إذا كنت لا تخطط لدعم لغات إضافية؟

  • ما هي الأسباب التي يمكن للمرء لإنشاء مشروع مع مجموعة أحرف متعددة البايت؟

  • كيف تصطدم كل العوامل المذكورة أعلاه في بيئة عالية الأداء (مثل لعبة الفيديو الحديثة)؟

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

المحلول

قضيتان سأعلق عليهما.

أولاً ، لا تذكر النظام الأساسي الذي تستهدفه. على الرغم من أن إصدارات Windows الحديثة (Win2000 و WinXP و Vista و Win7) تدعم كل من إصدارات Multibyte و Unicode من مكالمات النظام باستخدام السلاسل ، إلا أن إصدارات Unicode أسرع (إصدارات متعددة الأجزاء هي مغلفة تتحول إلى Unicod سلاسل العودة إلى mutlibyte). لذلك إذا كنت تقوم بالكثير من هذه الأنواع من المكالمات ، فستكون Unicode أسرع.

لمجرد أنك لا تخطط لدعم لغات إضافية بشكل صريح ، فلا يزال يتعين عليك التفكير في دعم Unicode إذا كان التطبيق الخاص بك يحفظ ويعرض النص الذي أدخله المستخدمون. لمجرد أن تطبيقك غير مؤلف ، لا يتبع أن كل المستخدمين سيكونون غير مؤلفين أيضًا. قد يكونون سعداء تمامًا لاستخدام واجهة المستخدم الرسومية في اللغة الإنجليزية ، لكنهم قد يرغبون في إدخال أسماء أو تعليقات أو نص آخر بلغتهم الخاصة وعرضها بشكل صحيح.

نصائح أخرى

أنت تتحدث عن إعداد مشروع VC ++ هنا ، أليس كذلك؟

الشيء الوحيد الذي يؤثر عليه هو إصدار WIN32 API الذي ينتهي به الأمر. على سبيل المثال ، مكالمة إلى MessageBox سوف ينتهي به المطاف كمكالمة إلى MessageBoxA في حالة الإعداد متعدد البايت ، و MessageBoxW في حالة إعداد Unicode. بالطبع ، سيؤثر ذلك على أنواع معلمات السلسلة لتلك الوظائف أيضًا. داخليا، MessageBoxA المكالمات MessageBoxW بعد تحويل paramteres السلسلة من لغة النظام الحالية إلى Unicode.

نصيحتي هي استخدام إعدادات Unicode وتمرير سلاسل Unicode لمكالمات API Win32. هذا لا يمنعك من استخدام السلاسل في أي تشفير آخر داخليًا.

الإجابة المختصرة (IMO ، وأنا أخطأت) هي أنه من الأفضل أن تخطط للأسوأ (أو الأفضل اعتمادًا على وجهة نظرك) والقيام بوحدة Unicode الآن.

ما لم يكن تطبيقك مكثفًا جدًا ، فإن الذهاب مباشرة إلى Unicode لن يهم حقًا ؛ في حالة الألعاب ، لا ينبغي أن يكون عاملاً كبيرًا مقارنة ببقية المحرك.

الأعلى.

إليك اعتبارًا بسيطًا: هل يجب أن يعمل البرنامج إذا كان يستخدمه السيد 菅 直 直؟ قد يكون من الصعب تمثيل دليله الرئيسي في ASCII.

هل هناك إيجابيات للذهاب إلى Unicode مباشرة من البداية ،

بضع سنوات ومليون سطر من التعليمات البرمجية في وقت لاحق ، سوف تتمنى أن تكون قد أجبت "نعم".

مما يعني أن كل ما تبذلونه من سلاسل سوف يكون بتنسيق واسع؟

أتمنى أن تتوقف Microsoft عن خلط "Unicode" مع UTF-16.

ليس عليك تخزين جميع سلاسلك بتنسيق واسع. يمكنك استخدام UTF-8 بدلاً من ذلك ، والحصول على بصمة ذاكرة أصغر (للغات الأبجدية اللاتينية) ، والتوافق مع ASCII 7 بت.

الجانب السلبي الوحيد لاستخدام UTF-8 على Windows هو أنه غير مدعوم كصفحة رمز ANSI ، لذلك يتعين عليك تحويل سلاسلك إلى UTF-16 لإجراء مكالمات Winapi. يعتمد مقدار الإزعاج الذي يسببه هذا على ما إذا كنت تكتب برنامج Windows أو برنامج يحدث فقط على Windows.

الجواب الأول على هذا السؤال يجب ... الإجابة على كل ما تحتاج إلى معرفته.

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