Maison  >  Article  >  développement back-end  >  Comment obtenir une sortie UTF-8 multiplateforme avec std :: cout sous Windows ?

Comment obtenir une sortie UTF-8 multiplateforme avec std :: cout sous Windows ?

DDD
DDDoriginal
2024-11-03 06:45:30270parcourir

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

Sortie UTF-8 multiplateforme sous Windows avec std::cout

Lors du développement d'applications multiplateformes en C où les chaînes sont codées en UTF-8, il est crucial de s’assurer qu’ils sont gérés correctement sur différents systèmes d’exploitation. Sur les systèmes Unix, std::cout attend sans problème les chaînes de 8 bits codées en UTF-8. Cependant, sous Windows, la valeur par défaut est Latin-1 ou des formats non Unicode similaires.

Pour résoudre ce problème, le code tente d'utiliser _setmode() pour forcer std::cout à interpréter les chaînes 8 bits comme UTF-8 sous Windows. Cependant, cela déclenche une erreur d'assertion dans Visual Studio 2015.

Pour résoudre ce problème, une approche plus globale est nécessaire. Le code présenté ci-dessous combine des informations provenant de diverses sources :

<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>

Tout d'abord, la fonction SetConsoleOutputCP() est utilisée pour définir la page de codes de la console sur UTF-8, indiquant que le flux d'octets reçu doit être interprété comme UTF-8.

Ensuite, la mise en mémoire tampon est activée pour std::cout à l'aide de setvbuf(). En effet, le comportement par défaut de l'implémentation STL de Visual Studio consiste à transmettre des octets individuels au fichier sous-jacent, ce qui entraîne des problèmes avec les séquences d'octets UTF-8. La mise en mémoire tampon évite ce problème et améliore les performances. Il est également recommandé de vider périodiquement le flux avec std::endl, comme indiqué dans cet exemple.

Enfin, notez que pour que les caractères Unicode non-ASCII s'affichent correctement, la console Windows doit utiliser une police TrueType. Il s'agit de la valeur par défaut dans Windows 10, mais sous Windows 7 ou version antérieure, l'utilisateur devra peut-être la remplacer manuellement par une police telle que Consolas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn