سؤال

ما زلت أحاول تحديد ما إذا كان يجب استخدام مشروعي (المنزلي). ترميز UTF-8 سلاسل (يتم تنفيذها من حيث std::string مع وظائف إضافية خاصة بـ UTF-8 عند الضرورة) أو بعض السلاسل ذات 16 بت (يتم تنفيذها كـ std::wstring).المشروع عبارة عن لغة برمجة وبيئة (مثل VB، فهو مزيج من الاثنين معًا).

هناك بعض الرغبات/القيود:

  • سيكون أمرًا رائعًا لو أمكن تشغيله على أجهزة محدودة، مثل أجهزة الكمبيوتر ذات الذاكرة المحدودة.
  • أريد أن يتم تشغيل الكود على أنظمة التشغيل Windows وMac و(إذا كانت الموارد تسمح بذلك) Linux.
  • سأستخدم wxWidgets كطبقة واجهة المستخدم الرسومية الخاصة بي، ولكني أريد أن يقتصر الكود الذي يتفاعل مع مجموعة الأدوات هذه على زاوية قاعدة التعليمات البرمجية (سيكون لدي ملفات تنفيذية غير واجهة المستخدم الرسومية).
  • أرغب في تجنب العمل مع نوعين مختلفين من السلاسل عند العمل مع نص مرئي للمستخدم ومع بيانات التطبيق.

أعمل حاليًا مع std::string، بقصد استخدام وظائف معالجة UTF-8 فقط عند الضرورة.فهو يتطلب ذاكرة أقل، ويبدو أن هذا هو الاتجاه الذي تتجه إليه العديد من التطبيقات على أي حال.

إذا كنت توصي بترميز 16 بت، فأي ترميز: UTF-16? يو سي إس-2؟واحدة أخرى؟

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

المحلول

أوصي باستخدام UTF-16 لأي نوع من معالجة البيانات وواجهة المستخدم.يستخدم Mac OS X وWin32 API UTF-16، وهو نفس الشيء بالنسبة لـ wxWidgets وQt وICU وXerces وغيرها.قد يكون UTF-8 أفضل لتبادل البيانات وتخزينها.يرى http://unicode.org/notes/tn12/.

ولكن مهما كان اختيارك، فإنني أوصي بالتأكيد بعدم استخدام std::string مع UTF-8 "فقط عند الضرورة".

استمر حتى النهاية باستخدام UTF-16 أو UTF-8، ولكن لا تخلط وتطابق، فهذا يتطلب مشكلة.

نصائح أخرى

لا يزال UTF-16 عبارة عن ترميز أحرف متغير الطول (يوجد أكثر من 2^16 نقطة ترميز Unicode)، لذلك لا يمكنك إجراء عمليات فهرسة سلسلة O(1).إذا كنت تفعل الكثير من هذا النوع من الأشياء، فلن تقوم بحفظ أي شيء بسرعة تتجاوز UTF-8.من ناحية أخرى، إذا كان النص الخاص بك يتضمن الكثير من نقاط التشفير في النطاق 256-65535، فيمكن أن يمثل UTF-16 تحسينًا كبيرًا في الحجم.UCS-2 هو شكل مختلف من UTF-16 يكون طول ثابت، على حساب حظر أي نقاط تشفير أكبر من 2^16.

بدون معرفة المزيد عن متطلباتك، سأختار شخصيًا UTF-8.إنه الأسهل في التعامل معه لجميع الأسباب التي ذكرها الآخرون بالفعل.

بصراحة، لم أجد أي سبب لاستخدام أي شيء آخر غير UTF-8.

إذا قررت استخدام ترميز UTF-8، فاطلع على هذه المكتبة: http://utfcpp.sourceforge.net/

قد يجعل حياتك أسهل بكثير.

لقد قمت بالفعل بكتابة تطبيق مستخدم على نطاق واسع (أكثر من 5 ملايين مستخدم) بحيث يتم إضافة كل كيلو بايت مستخدم حرفيًا.وعلى الرغم من ذلك، فقد تمسكت بـ wxString.لقد قمت بتكوينها لتكون مشتقة من std::wstring، حتى أتمكن من تمريرها إلى الوظائف التي تتوقع wstring const&.

يرجى ملاحظة أن std::wstring هو Unicode أصلي على نظام التشغيل Mac (ليس هناك حاجة إلى UTF-16 للأحرف فوق U+10000)، وبالتالي فهو يستخدم 4 بايت/wchar_t.الميزة الكبرى لهذا هو أن i++ يمنحك الشخصية التالية دائمًا.في Win32، يكون هذا صحيحًا في 99.9% فقط من الحالات.كزميل مبرمج، ستفهم مدى ضآلة نسبة 99.9%.

لكن إذا لم تكن مقتنعًا، فاكتب الدالة بأحرف كبيرة std::string[UTF-8] وstd::wstring.ستخبرك هاتان الوظيفتان بأي طريق هو الجنون.

تنسيقك على القرص أمر آخر.بالنسبة لقابلية النقل، يجب أن يكون UTF-8.لا يوجد أي قلق بشأن النهاية في UTF-8، ولا مناقشة حول العرض (2/4).قد يكون هذا هو السبب الذي يجعل العديد من البرامج تستخدم UTF-8.

في ملاحظة لا علاقة لها بالموضوع، يرجى قراءة مقارنات سلسلة Unicode وتطبيعها.أو سينتهي بك الأمر بنفس الخطأ الموجود في .NET، حيث يمكن أن يكون لديك متغيرين föö وföö يختلفان فقط في التسوية (غير المرئية).

يعد MicroATX إلى حد كبير تنسيقًا قياسيًا للوحة الأم للكمبيوتر الشخصي، وهو قادر على توفير 4-8 جيجابايت من ذاكرة الوصول العشوائي.إذا كنت تتحدث عن picoATX، فربما تقتصر على 1-2 جيجابايت من ذاكرة الوصول العشوائي.وحتى ذلك الحين يعد هذا كثيرًا بالنسبة لبيئة التطوير.ما زلت متمسكًا بـ UTF-8 للأسباب المذكورة أعلاه، لكن الذاكرة لا ينبغي أن تكون مصدر قلقك.

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

وأود أيضا أن ننظر في وحدة العناية المركزة.إذا كنت لن تستخدم بعض ميزات STL الخاصة بالسلاسل، فقد يكون استخدام أنواع سلاسل ICU أفضل بالنسبة لك.

هل فكرت في استخدام wxStrings؟إذا كنت أتذكر بشكل صحيح، فيمكنهم إجراء تحويلات utf-8 <-> Unicode وسيجعل الأمر أسهل قليلاً عندما يتعين عليك تمرير السلاسل من وإلى واجهة المستخدم.

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