2 بايت (UCS-2) سلاسل واسعة تحت GCC
-
04-10-2019 - |
سؤال
عند نقل مشروع C ++ الخاص بي إلى GCC ، اكتشفت أن نوع بيانات WCHAR_T هو 4-بايت UTF-32 افتراضيًا. يمكنني تجاوز ذلك مع خيار برنامج التحويل البرمجي ، ولكن بعد ذلك ، أصبح جزء WCS* (WCSLEN ، WCSCMP ، وما إلى ذلك) من RTL غير صالح للاستخدام ، لأنه يفترض سلاسل واسعة 4 بايت.
في الوقت الحالي ، قمت بإعادة تنفيذ 5-6 من هذه الوظائف من نقطة الصفر ووحيد تطبيقاتي فيه. ولكن هل هناك خيار أكثر أناقة-على سبيل المثال ، بناء من GCC RTL مع 2 بايت WCHAR-T يجلس بهدوء في مكان ما ، في انتظار ذلك تكون مرتبطة؟
النكهات المحددة لـ GCC التي أنا بعدها هي Xcode على Mac OS X ، Cygwin ، والنكهات التي تأتي مع حفر Debian Linux.
المحلول 4
إعادة تنفيذ 5-6 من وظائف WCS الأكثر شيوعا ، #محددة تطبيقاتي في.
نصائح أخرى
ولكن هل هناك خيار أكثر أناقة-على سبيل المثال ، بناء من GCC RTL مع 2-بايت WCHAR-T يجلس بهدوء في مكان ما ، في انتظار ربطه؟
لا ، هذه مشكلة خاصة منصة ، وليس مشكلة في مجلس التعاون الخليجي.
وهذا يعني أن منصة Linux ABI تحدد ذلك wchar_t
هو 32 بتات ، لذلك إما عليك استخدام مكتبة جديدة كاملة (التي تعد وحدة العناية المركزة لها خيارًا شائعًا) ، أو قم بتوصيل الكود الخاص بك للتعامل مع 4 بايت wchar_t
س. جميع المكتبات التي قد تربطها ستفترض أيضًا 4 بايت wchar_t
, ، و إرادة استراحة إذا كنت تستخدم GCC's -fshort-wchar
.
ولكن على Linux على وجه التحديد ، قام كل شخص تقريبًا بتوحيد على UTF-8 لجميع الترميزات المتعددة.
انظر الى مكتبة وحدة العناية المركزة. إنها مكتبة محمولة مع واجهة برمجة تطبيقات UTF-16.
كما لاحظت ، يتم تعريف WCHAR_T. لا توجد طريقة للعمل المحمول مع نوع البيانات هذا.
كانت شركة Linux Systems بشكل عام تتمتع بميزة الحصول على دعم Unicode لاحقًا ، بعد إعلان كارثة UCS-2 بأكملها أنها فكرة غير رائعة ، واستخدم UTF-8 كترميز. لا تزال جميع واجهات برمجة تطبيقات النظام تعمل على char*، وهي آمنة.
أفضل رهاناتك هي استخدام مكتبة تدير هذا لك: QT ، وحدة العناية المركزة ، إلخ.
لاحظ أن Cygwin يتميز بـ 2 بايت WCHAR_T لجعل meshing مع Windows أسهل.