web-dev-qa-db-fra.com

Sortie Unicode à la console à l'aide de C ++, sous Windows

J'apprends toujours C++, alors portez-moi avec moi et mon code bâclé. Le compilateur que j'utilise est DEV C++. Je veux pouvoir générer des caractères Unicode à la console à l'aide de COUT. Quand j'essaie des choses comme:

#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
    std::cout << "Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";
    system("PAUSE");
    return 0;
}

Il génère des caractères étranges à la console, comme μA ■ gg. Pourquoi le fait-il et comment puis-je arriver à afficher đßğĝ? Ou n'est-ce pas possible avec Windows?

25
Jesse Foley

Qu'en est-il de std::wcout?

#include <iostream>

int main() {
    std::wcout << L"Hello World!" << std::endl;
    return 0;
}

Il s'agit du flux de sortie de caractères large standard.

Pourtant, comme l'a souligné Adrian, cela ne traite pas du fait cmd, par défaut, ne gère pas les sorties Unicode. Ceci peut être adressé par la configuration manuelle de la console, comme décrit dans la réponse de Adrian:

  • Démarrer cmd avec l'argument /u;
  • Appeler chcp 65001 Pour changer le format de sortie;
  • Et définir une police unicode dans la console (comme Lucida Console Unicode).

Vous pouvez également essayer d'utiliser _setmode(_fileno(stdout), _O_U16TEXT);, qui nécessite fcntl.h Et io.h (Comme décrit dans cette réponse , et documenté dans ce blog post )).

15
Tyn

Je ne suis pas sûr que Windows XP Supporte pleinement ce dont vous avez besoin. Il y a trois choses que vous devez faire pour activer UNICODE avec une console de commande:

  1. Démarrer la fenêtre de commande avec cmd /u. Les /u dit que vos programmes produiront UNICODE.
  2. Utilisation chcp 65001 Pour indiquer que vous souhaitez utiliser UTF-8 au lieu de l'une des pages de code.
  3. Sélectionnez une police avec plus de couverture de glyphe. La commande Windows dans les nouvelles versions de Windows Offre Lucida Console Unicode. Mon XP boîte a un sous-ensemble de celui appelé Lucida Console. Il n'a pas de répertoire très complet, mais cela devrait être suffisant si vous essayez simplement d'afficher certains caractères accentués.
6
Adrian McCarthy

Vous avez utilisé le flux de sortie ANSI. Vous devez utiliser
[.____] std::wcout << L"Blah blah blah some gibberish unicode: ĐĄßĞĝ\n";

Aussi, utilisez STD :: Cin.get (), pas System ("Pause")

1
Puppy