¿Cómo puedo usar system(“chcp 936”) en mi proyecto basado en diálogos?
El código a continuación tiene como objetivo convertir una wstring “!” a una string y mostrarla como resultado:
setlocale(LC_ALL, "Chinese_China.936");
//system("chcp 936");
std::wstring ws = L"!";
std::string as((ws.length()) * sizeof(wchar_t), '-');
auto rs = wcstombs((char*)as.c_str(), ws.c_str(), as.length());
as.resize(rs);
cout << rs << ":" << as << endl;
Si se ejecuta sin system("chcp 936")
, la cadena convertida es “£¡” en lugar de “!”. Si se ejecuta con system("chcp 936")
, el resultado es correcto en un proyecto de consola.
Pero en mi proyecto basado en diálogos, system("chcp 936")
no es útil, incluso si funciona, no puedo usarlo porque aparecerá una consola.
PD: El IDE es Visual Studio 2019 y mi código fuente está almacenado en UTF-8 con firma.
El idioma de mi sistema operativo es inglés y el idioma para programas que no son Unicode es inglés (Estados Unidos).
Edit: Es interesante, incluso con la configuración regional “en-US”, “!” puede convertirse en un ASCII “!”.
Pero no entiendo de dónde obtuve “£¡” en el proyecto basado en diálogos.
davy.ai
Solución para convertir wstring a string con la configuración regional china
El problema de convertir
wstring
astring
con la configuración regional china se puede resolver estableciendo la página de códigos correcta para la salida de la consola.Al ejecutar el código en un proyecto de consola, utilizando
system("chcp 936")
se establece la página de códigos en chino simplificado GBK, lo que imprime correctamente la cadena convertida.Sin embargo, al utilizar un proyecto basado en diálogos, el comando
system("chcp 936")
no es efectivo, ya que abre una ventana de consola.Para resolver este problema, puedes establecer la página de códigos directamente en tu código utilizando la función
SetConsoleOutputCP
, de la siguiente manera:Después de establecer la página de códigos, la cadena convertida
as
se mostrará correctamente en la salida de la consola o del diálogo.También vale la pena mencionar que incluso con la configuración regional
en-US
, el carácter!
puede convertirse automáticamente en un!
ASCII.