¿Cómo puedo cin y cout algún texto Unicode?

Pido un fragmento de código que cin un texto unicode, concatena otro unicode al primer texto Unicode y el resultado es cout.

PD: Este código me ayudará a resolver otro problema mayor con Unicode. Pero antes, la clave es lograr lo que pido.

AGREGADO: Por cierto, no puedo escribir en la línea de comandos ningún símbolo Unicode cuando ejecuto el archivo ejecutable. ¿Cómo debería hacer eso?

Aquí hay un ejemplo que muestra cuatro métodos diferentes, de los cuales solo el tercero (C conio ) y el cuarto (API nativa de Windows) funcionan (pero solo si stdin / stdout no se redireccionan). Tenga en cuenta que todavía necesita una fuente que contenga el carácter que desea mostrar (la consola Lucida admite al menos caracteres griegos y cirílicos). Tenga en cuenta que aquí todo es completamente no portátil, simplemente no hay una forma portátil de entrada / salida de cadenas Unicode en el terminal.

 #ifndef UNICODE #define UNICODE #endif #ifndef _UNICODE #define _UNICODE #endif #define STRICT #define NOMINMAX #define WIN32_LEAN_AND_MEAN #include  #include  #include  #include  #include  #include  void testIostream(); void testStdio(); void testConio(); void testWindows(); int wmain() { testIostream(); testStdio(); testConio(); testWindows(); std::system("pause"); } void testIostream() { std::wstring first, second; std::getline(std::wcin, first); if (!std::wcin.good()) return; std::getline(std::wcin, second); if (!std::wcin.good()) return; std::wcout << first << second << std::endl; } void testStdio() { wchar_t buffer[0x1000]; if (!_getws_s(buffer)) return; const std::wstring first = buffer; if (!_getws_s(buffer)) return; const std::wstring second = buffer; const std::wstring result = first + second; _putws(result.c_str()); } void testConio() { wchar_t buffer[0x1000]; std::size_t numRead = 0; if (_cgetws_s(buffer, &numRead)) return; const std::wstring first(buffer, numRead); if (_cgetws_s(buffer, &numRead)) return; const std::wstring second(buffer, numRead); const std::wstring result = first + second + L'\n'; _cputws(result.c_str()); } void testWindows() { const HANDLE stdIn = GetStdHandle(STD_INPUT_HANDLE); WCHAR buffer[0x1000]; DWORD numRead = 0; if (!ReadConsoleW(stdIn, buffer, sizeof buffer, &numRead, NULL)) return; const std::wstring first(buffer, numRead - 2); if (!ReadConsoleW(stdIn, buffer, sizeof buffer, &numRead, NULL)) return; const std::wstring second(buffer, numRead); const std::wstring result = first + second; const HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE); DWORD numWritten = 0; WriteConsoleW(stdOut, result.c_str(), result.size(), &numWritten, NULL); } 
  • Editar 1 : He agregado un método basado en conio .
  • Edición 2 : He estado _O_U16TEXT con _O_U16TEXT un poco como se describe en el blog de Michael Kaplan, pero aparentemente solo había interpretado los datos de (8 bits) de ReadFile como UTF-16. Voy a investigar esto un poco más durante el fin de semana.

Dependiendo del tipo de Unicode que quieras decir. Supongo que quiere decir que solo está trabajando con std::wstring sin embargo. En ese caso use std::wcin y std::wcout .

Para la conversión entre codificaciones puede usar las funciones de su sistema operativo como Win32: WideCharToMultiByte , MultiByteToWideChar o puede usar una biblioteca como libiconv

Tuve un problema similar en el pasado, en mi caso sync_with_stdio y sync_with_stdio funcionó. Prueba esto:

 #include  #include  #include  using namespace std; int main() { ios_base::sync_with_stdio(false); wcin.imbue(locale("en_US.UTF-8")); wcout.imbue(locale("en_US.UTF-8")); wstring s; wstring t(L" la Polynésie française"); wcin >> s; wcout << s << t << endl; return 0; } 

Si tiene texto real (es decir, una cadena de caracteres lógicos), en su lugar, inserte en las transmisiones anchas. Las secuencias amplias codificarán automáticamente sus caracteres para que coincidan con los bits esperados por la encoding de configuración regional. (Y si tiene bits codificados en su lugar, las secuencias decodificarán los bits y luego los volverá a codificar para que coincidan con la configuración regional).

Hay una solución menor si SABES que tienes bits codificados en UTF (es decir, una matriz de bits destinada a decodificarse en una cadena de caracteres lógicos) Y SABES que el objective de la secuencia de salida espera ese mismo formato de bit, a continuación, puede omitir los pasos de deencoding y reencoding y escribir () los bits tal como están. Esto solo funciona cuando sabe que ambas partes usan el mismo formato de encoding, lo que puede ser el caso de pequeñas utilidades que no están destinadas a comunicarse con procesos en otras configuraciones regionales.

Depende del sistema operativo. Si su OS entiende, puede simplemente enviar secuencias UTF-8.