"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية إخراج سلاسل UTF-8 بشكل صحيح إلى `std::cout` على نظام التشغيل Windows؟

كيفية إخراج سلاسل UTF-8 بشكل صحيح إلى `std::cout` على نظام التشغيل Windows؟

تم النشر بتاريخ 2024-11-12
تصفح:457

How to Output UTF-8 Strings Correctly to `std::cout` on Windows?

التعامل مع سلاسل UTF-8 في لغة C على نظام التشغيل Windows

يتم استخدام تشفير السلاسل كـ UTF-8 على نطاق واسع للتطبيقات عبر الأنظمة الأساسية. ومع ذلك، فإن إخراج سلاسل UTF-8 إلى std::cout على Windows يمثل تحديات فريدة.

السلوك الافتراضي على Windows هو أن تتوقع std::cout سلاسل بتنسيقات غير Unicode. عند تقديمه باستخدام سلاسل UTF-8، فإنه يعرض أحرفًا تالفة.

لمعالجة هذه المشكلة، هناك خطوتان أساسيتان:

  1. تعيين صفحة رموز وحدة التحكم على UTF-8 : باستخدام وظيفة SetConsoleOutputCP، أبلغ وحدة التحكم بأن دفق البايت الوارد هو UTF-8 مشفر.
  2. تمكين التخزين المؤقت للدفق: تعطيل السلوك الافتراضي لـ std::basic_filebuf في Visual Studio، الذي يقسم تسلسلات بايت UTF-8 ويمررها كبايتات فردية. للتغلب على ذلك، يمكّن setvbuf التخزين المؤقت للتيار، مما يضمن تمرير السلسلة بأكملها ككل.

إليك مقتطف التعليمات البرمجية المنقح الذي يتضمن هذه الحلول:

#include 
#include 
#include 
#include 

int main() {
    // Set console code page to UTF-8
    SetConsoleOutputCP(CP_UTF8);

    // Enable buffering to prevent byte-by-byte transmission
    setvbuf(stdout, nullptr, _IOFBF, 1000);

    // Output UTF-8 string
    std::string test = u8"Greek: αβγδ; German: Übergrößenträger";
    std::cout 

بالإضافة إلى هذه الخطوات، لاحظ أن الخطوط النقطية في وحدة تحكم Windows قد لا تعرض أحرف غير ASCII Unicode بشكل صحيح. لتمكين العرض المناسب، يوصى بالتبديل إلى خط TrueType، والذي أصبح الآن الخط الافتراضي في نظام التشغيل Windows 10 والإصدارات الأحدث.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3