Come stampare caratteri Unicode in C ++?

Sto cercando di stampare un carattere russo “ф” ( U + 0444 CYRILLIC SMALL LETTER EF), a cui viene assegnato un codice decimale 1092 . Usando C ++, come posso stampare questo personaggio? Avrei pensato che qualcosa del genere avrebbe funzionato, tuttavia …

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

    Per rappresentare il personaggio puoi usare Universal Character Names (UCN). Il carattere ‘ф’ ha il valore Unicode U + 0444 e quindi in C ++ potresti scrivere ‘\ u0444’ o ‘\ U00000444’. Inoltre, se la codifica del codice sorgente supporta questo carattere, puoi semplicemente scriverlo letteralmente nel tuo codice sorgente.

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

    La stampa di tali caratteri dipende da cosa stai stampando. Se si sta stampando su un emulatore di terminale Unix, l’emulatore di terminale sta usando una codifica che supporta questo carattere e la codifica corrisponde alla codifica di esecuzione del compilatore, quindi è ansible eseguire quanto segue:

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

    Questo programma non richiede che 'ф' possa essere rappresentato in un singolo carattere. Su OS X e sulla maggior parte delle installazioni Linux moderne, funzionerà bene, poiché le codifiche sorgente, di esecuzione e della console saranno tutte UTF-8 (che supporta tutti i caratteri Unicode).

    Le cose sono più difficili con Windows e ci sono diverse possibilità con diversi compromessi.

    Probabilmente il migliore, se non hai bisogno di un codice portatile (utilizzerai wchar_t, che dovrebbe essere evitato su ogni altra piattaforma), è quello di impostare la modalità dell'handle del file di output per prendere solo i dati UTF-16.

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

    Il codice portatile è più difficile.

    In definitiva, questo è completamente dipendente dalla piattaforma. Il supporto Unicode è, sfortunatamente, molto scarso in Standard C ++. Per GCC, dovrai renderlo una stringa stretta, dato che usano UTF-8, e Windows vuole una stringa ampia, e tu devi eseguire l’output su wcout .

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

    Quando si compila con -std=c++11 , si può semplicemente

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

    Se usi Windows (nota, stiamo usando printf (), non cout):

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

    Non Unicode ma funzionante – 1251 invece di UTF8:

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

    '1060' è di quattro caratteri e non verrà compilato secondo lo standard. Dovresti semplicemente considerare il personaggio come un numero, se i tuoi caratteri larghi corrispondono a 1: 1 con Unicode (controlla le impostazioni locali).

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

    In Linux, posso solo fare:

     std::cout < < "ф"; 

    Ho appena copiato i caratteri da qui e non ha fallito almeno per il campione casuale su cui ho provato.