Comment imprimer le caractère Unicode en C ++?

J’essaie d’imprimer un caractère russe “ф” ( U + 0444 CYRILLIC SMALL LETTER EF), qui reçoit un code décimal 1092 . En utilisant C ++, comment puis-je imprimer ce caractère? J’aurais pensé que quelque chose comme les suivants fonctionnerait, pourtant …

int main (){ wchar_t f = '1060'; cout << f << endl; } 

    Pour représenter le personnage, vous pouvez utiliser les noms de caractères universels (UCN). Le caractère ‘ф’ a la valeur Unicode U + 0444 et en C ++, vous pouvez l’écrire ‘\ u0444’ ou ‘\ U00000444’. Aussi, si l’encodage du code source prend en charge ce caractère, vous pouvez simplement l’écrire littéralement dans votre code source.

     // both of these assume that the character can be represented with // a single char in the execution encoding char b = '\u0444'; char a = 'ф'; // this line additionally assumes that the source character encoding supports this character 

    L’impression de ces caractères dépend de ce que vous imprimez. Si vous imprimez sur un émulateur de terminal Unix, l’émulateur de terminal utilise un codage qui prend en charge ce caractère, et cet encodage correspond au codage d’exécution du compilateur. Vous pouvez alors effectuer les opérations suivantes:

     #include  int main() { std::cout << "Hello, ф or \u0444!\n"; } 

    Ce programme n'exige pas que «ф» puisse être représenté dans un seul caractère. Sous OS X et la plupart des installations Linux modernes, cela fonctionnera très bien, car les encodages source, exécution et console seront tous UTF-8 (qui supporte tous les caractères Unicode).

    Les choses sont plus difficiles avec Windows et il existe différentes possibilités avec différents compromis.

    Probablement le meilleur, si vous n'avez pas besoin de code portable (vous utiliserez wchar_t, qui devrait être évité sur toutes les autres plates-formes), consiste à définir le mode du descripteur de fichier de sortie pour qu'il ne prenne que des données UTF-16.

     #include  #include  #include  int main() { _setmode(_fileno(stdout), _O_U16TEXT); std::wcout << L"Hello, \u0444!\n"; } 

    Le code portable est plus difficile.

    En fin de compte, cela dépend complètement de la plate-forme. Le support Unicode est malheureusement très médiocre en standard C ++. Pour GCC, vous devrez en faire une chaîne étroite, car ils utilisent UTF-8, et Windows veut une chaîne large, et vous devez générer une sortie sur wcout .

     // GCC std::cout << "ф"; // Windoze wcout << L"ф"; 

    Lors de la compilation avec -std=c++11 , on peut simplement

      const char *s = u8"\u0444"; cout << s << endl; 

    Si vous utilisez Windows (notez que nous utilisons printf (), pas cout):

     //Save As UTF8 without signature #include  #include int main (){ SetConsoleOutputCP(65001); printf("ф\n"); } 

    Pas Unicode mais fonctionne – 1251 au lieu de UTF8:

     //Save As Windows 1251 #include  #include using namespace std; int main (){ SetConsoleOutputCP(1251); cout << "ф" << endl; } 

    '1060' est composé de quatre caractères et ne sera pas compilé sous la norme. Vous devez simplement traiter le caractère comme un nombre, si vos caractères larges correspondent à 1: 1 avec Unicode (vérifiez vos parameters régionaux).

     int main (){ wchar_t f = 1060; wcout << f << endl; } 

    Sous Linux, je peux juste faire:

     std::cout << "ф"; 

    Je me suis contenté de copier des caractères d' ici et cela n'a pas échoué pour au moins l'échantillon aléatoire que j'ai essayé.