Bagaimana untuk Mencapai Output UTF-8 Cross-Platform dengan std::cout pada Windows?

DDD
Lepaskan: 2024-11-03 06:45:30
asal
268 orang telah melayarinya

How to Achieve Cross-Platform UTF-8 Output with std::cout on Windows?

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan