Cómo imprimir caracteres Unicode en C ++?

Estoy intentando imprimir un carácter ruso “ф” ( U + 0444 CYRILLIC SMALL LETTER EF), que recibe un código decimal 1092 . Usando C ++, ¿cómo puedo imprimir este personaje? Hubiera pensado que algo como lo siguiente funcionaría, sin embargo …

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

Para representar al personaje, puede usar los nombres de carácter universal (UCN). El carácter ‘ф’ tiene el valor Unicode U + 0444 y así en C ++ podría escribirlo ‘\ u0444’ o ‘\ U00000444’. Además, si la encoding del código fuente admite este carácter, puede simplemente escribirlo literalmente en su código fuente.

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

Imprimir dichos caracteres depende de lo que está imprimiendo. Si está imprimiendo en un emulador de terminal Unix, el emulador de terminal está utilizando una encoding que admite este carácter, y esa encoding coincide con la encoding de ejecución del comstackdor, entonces puede hacer lo siguiente:

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

Este progtwig no requiere que 'ф' se pueda representar en un solo char. En OS X y en la mayoría de las instalaciones modernas de Linux esto funcionará bien, ya que las codificaciones fuente, ejecución y consola serán todas UTF-8 (que admite todos los caracteres Unicode).

Las cosas son más difíciles con Windows y hay diferentes posibilidades con diferentes compensaciones.

Probablemente lo mejor, si no necesita un código portátil (usará wchar_t, lo que realmente debería evitarse en cualquier otra plataforma), es establecer el modo del manejador del archivo de salida para tomar solo datos UTF-16.

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

El código portátil es más difícil.

En última instancia, esto depende completamente de la plataforma. El soporte de Unicode es, lamentablemente, muy pobre en el estándar C ++. Para GCC, tendrá que hacer una cadena estrecha, ya que usan UTF-8, y Windows quiere una cadena ancha, y debe enviar a wcout .

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

Al comstackr con -std=c++11 , uno puede simplemente

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

Si usa Windows (nota, estamos usando printf (), no cout):

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

No Unicode pero funciona – 1251 en lugar de UTF8:

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

'1060' tiene cuatro caracteres y no se comstackrá según el estándar. Solo debe tratar al personaje como un número, si sus caracteres anchos coinciden con 1: 1 con Unicode (verifique la configuración de su configuración regional).

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

En Linux, puedo hacer lo siguiente:

 std::cout << "ф"; 

Acabo de copiar y pegar caracteres de aquí y no falló al menos la muestra aleatoria que probé.