Caractère Unicode Visual C ++

J’essaie de faire fonctionner mon programme avec des caractères Unicode. J’utilise Visual Studio 2010 sur un ordinateur Windows 7 x32.

Ce que je veux imprimer, c’est le symbole de la reine (“\ ul2655”) et cela ne fonctionne tout simplement pas. J’ai configuré ma solution pour utiliser Unicode.

Ceci est mon exemple de code:

#include  using namespace std; int main() { SetConsoleOutputCP(CP_UTF8); wcout << L"\u2655"; return 0; } 

De plus, j’ai essayé beaucoup d’autres suggestions, mais rien n’a fonctionné. (par exemple, changez la police cmd, appliquez chcp 65001, qui est identique à SetConsoleOutputCP (CP_UTF8), etc.).

Quel est le problème? C’est la première fois que je rencontre une telle situation. Sur Linux, c’est différent.

Je vous remercie.

Une fois, j’ai réussi à imprimer des pièces d’échecs sur la console; plusieurs complexités sont impliquées ici.

Tout d’abord, vous devez activer le mode UTF-16 sur stdout; ceci est décrit ici aussi bien qu’ici , et c’est exactement comme Mehrdad l’a expliqué.

 #include  #include  ... _setmode(_fileno(stdout), _O_U16TEXT); 

Ensuite, même si la sortie a atteint la console correctement, sur la console, vous risquez de perdre de la place à la place des caractères prévus. cela vient du fait que, du moins sur ma machine (Windows 7), la police par défaut de la console ne prend pas en charge les glyphes des pièces d’échecs.

Pour résoudre ce problème, vous devez choisir une police TrueType différente qui les prend en charge, mais pour rendre une telle police disponible, vous devez effectuer quelques étapes . Personnellement, j’ai découvert que DejaVu Sans Mono fonctionne très bien.

Donc, à ce stade, votre code devrait fonctionner, et un code comme celui-ci (l’exemple que j’ai écrit dans le passé pour tester ce problème):

 #include  #include  #include  #ifdef _WIN32 #include  #include  #endif enum ChessPiecesT { King, Queen, Rock, Bishop, Knight, Pawn, }; enum PlayerT { White=0x2654, /* white king */ Black=0x265a, /* black king */ }; /* Provides the character for the piece */ wchar_t PieceChar(enum PlayerT Player, enum ChessPiecesT Piece) { return (wchar_t)(Player + Piece); } /* First row of the chessboard (black) */ enum ChessPiecesT TopRow[]={Rock, Knight, Bishop, Queen, King, Bishop, Knight, Rock}; void PrintTopRow(enum PlayerT Player) { int i; for(i=0; i<8; i++) putwchar(PieceChar(Player, TopRow[Player==Black?i: (7-i)])); putwchar(L'\n'); } /* Prints the eight pawns */ void PrintPawns(enum PlayerT Player) { wchar_t pawnChar=PieceChar(Player, Pawn); int i; for(i=0; i<8; i++) putwchar(pawnChar); putwchar(L'\n'); } int main() { #ifdef _WIN32 _setmode(_fileno(stdout), _O_U16TEXT); #else setlocale(LC_CTYPE, ""); #endif PrintTopRow(Black); PrintPawns(Black); fputws(L"\n\n\n\n", stdout); PrintPawns(White); PrintTopRow(White); return 0; } 

devrait fonctionner aussi bien sous Windows que sous Linux.

Maintenant, vous avez toujours un problème: les glyphes seront trop petits pour avoir un sens quelconque:

échiquier sur console

ceci ne peut être résolu qu'en agrandissant la police de la console, mais vous obtiendrez tous les autres caractères trop volumineux pour être utilisables. Ainsi, dans l’ensemble, la meilleure solution consiste probablement à écrire une application à interface graphique.

Essayez ceci à la place

 _setmode(_fileno(stdout), _O_U16TEXT);