c++ unicode iostream cout wchar-t

Cómo imprimir caracteres Unicode en C++?



ansi c unicode (6)

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, aún ...

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


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

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


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"ф";


En Linux, puedo hacer lo siguiente:

std::cout << "ф";

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


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 codificación 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 codificación que admite este carácter, y esa codificación coincide con la codificación de ejecución del compilador, entonces puede hacer lo siguiente:

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

Este programa 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 <iostream> #include <io.h> #include <fcntl.h> int main() { _setmode(_fileno(stdout), _O_U16TEXT); std::wcout << L"Hello, /u0444!/n"; }

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


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

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

No Unicode pero funciona - 1251 en lugar de UTF8:

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


''1060'' tiene cuatro caracteres y no se compilará 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; }