web-dev-qa-db-fra.com

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

J'essaie d'imprimer un caractère russe "ф" ( U + 0444 CYRILLIC SMALL LETTER EF), auquel un code décimal 1092 est attribué. En C++, comment puis-je imprimer ce personnage? J'aurais pensé que quelque chose comme ce qui suit pourrait marcher, mais ...

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

Pour représenter le caractère, vous pouvez utiliser des noms de caractères universels (UCN). Le caractère 'ф' a la valeur Unicode U + 0444 et vous pouvez donc l'écrire en C++ '\ u0444' ou '\ U00000444'. De plus, si le codage 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 tels caractères dépend de ce sur quoi vous imprimez. Si vous imprimez sur un émulateur de terminal Unix, celui-ci utilise un codage qui prend en charge ce caractère et correspond au codage d'exécution du compilateur. Vous pouvez alors procéder comme suit:

#include <iostream>

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

Ce programme ne nécessite pas ne nécessite pas que "ф" puisse être représenté dans un seul caractère. Sur OS X et la plupart des installations Linux modernes, cela fonctionnera parfaitement, car les codages source, d’exécution et de console seront tous au format UTF-8 (qui prend en charge tous les caractères Unicode).

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

Le mieux, si vous n'avez pas besoin de code portable (vous utiliserez wchar_t, ce 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 <iostream>
#include <io.h>
#include <fcntl.h>

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

Le code portable est plus difficile.

47
bames53

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

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

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

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

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

//Save As UTF8 without signature
#include <stdio.h>
#include<windows.h>
int main (){
    SetConsoleOutputCP(65001); 
    printf("ф\n");
}

Pas Unicode mais fonctionne - 1251 au lieu de UTF8:

//Save As Windows 1251
#include <iostream>
#include<windows.h>
using namespace std;
int main (){
    SetConsoleOutputCP(1251); 
    cout << "ф" << endl;
}
6
vladasimovic

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

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

J'avais besoin d'afficher la chaîne dans l'interface utilisateur et de l'enregistrer dans un fichier de configuration XML. Le format spécifié ci-dessus convient aux chaînes de caractères en c ++. J'ajouterais que nous pouvons avoir une chaîne compatible XML pour le caractère spécial en remplaçant "\ u" par "& # x" et en ajoutant un ";" à la fin.

Par exemple: C++: "\ u0444" -> XML: "&#x0444;"

0
MGR

Une autre solution sous Linux:

string a = "Ф";
cout << "Ф = \xd0\xa4 = " << hex
     << int(static_cast<unsigned char>(a[0]))
     << int(static_cast<unsigned char>(a[1])) << " (" << a.length() << "B)" << endl;

string b = "√";
cout << "√ = \xe2\x88\x9a = " << hex
     << int(static_cast<unsigned char>(b[0]))
     << int(static_cast<unsigned char>(b[1]))
     << int(static_cast<unsigned char>(b[2])) << " (" << b.length() << "B)" << endl;
0
VoyciecH

Sous Linux, je peux juste faire:

std::cout << "ф";

Je viens de copier-coller des caractères de ici et cela n’a pas échoué pour au moins l’échantillon aléatoire que j’ai essayé.

0
quanta