Cross-Platform UTF-8 Output pada Windows dengan std::cout
Apabila membangunkan aplikasi merentas platform dalam C di mana rentetan dikodkan dalam UTF-8, adalah penting untuk memastikan bahawa ia dikendalikan dengan betul merentas sistem pengendalian yang berbeza. Pada sistem Unix, std::cout menjangkakan rentetan 8-bit yang dikodkan UTF-8 tanpa masalah. Walau bagaimanapun, pada Windows, ia lalai kepada format Latin-1 atau bukan Unikod yang serupa.
Untuk menangani isu ini, kod cuba menggunakan _setmode() untuk memaksa std::cout mentafsir rentetan 8-bit sebagai UTF-8 pada Windows. Walau bagaimanapun, ini mencetuskan ralat penegasan dalam Visual Studio 2015.
Untuk menyelesaikannya, pendekatan yang lebih komprehensif diperlukan. Kod yang ditunjukkan di bawah menggabungkan cerapan daripada pelbagai sumber:
<code class="cpp">#include <string> #include <iostream> #include <Windows.h> #include <cstdio> int main() { // Set console code page to UTF-8 SetConsoleOutputCP(CP_UTF8); // Enable stream buffering to prevent byte-by-byte output setvbuf(stdout, nullptr, _IOFBF, 1000); std::string test = u8"Greek: αβγδ; German: Übergrößenträger"; std::cout << test << std::endl; return 0; }</code>
Pertama, fungsi SetConsoleOutputCP() digunakan untuk menetapkan halaman kod konsol kepada UTF-8, menunjukkan bahawa aliran bait yang diterima harus ditafsirkan sebagai UTF-8.
Seterusnya, penimbalan didayakan untuk std::cout menggunakan setvbuf(). Ini kerana tingkah laku lalai pelaksanaan STL Visual Studio adalah untuk menghantar bait individu ke fail asas, menyebabkan masalah dengan urutan bait UTF-8. Penimbalan menghalang isu ini dan meningkatkan prestasi. Siram strim secara berkala dengan std::endl, seperti yang ditunjukkan dalam contoh ini, juga disyorkan.
Akhir sekali, ambil perhatian bahawa untuk aksara Unicode bukan ASCII dipaparkan dengan betul, konsol Windows mesti menggunakan fon TrueType. Ini ialah lalai dalam Windows 10, tetapi pada Windows 7 atau lebih awal, pengguna mungkin perlu menukarnya secara manual kepada fon seperti Consolas.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Output UTF-8 Cross-Platform dengan std::cout pada Windows?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!