如何在基于对话框的项目中使用 system("chcp 936")?

How do I use system("chcp 936") in my dialog based project?

下面的代码是将一个wstring "!" 转换成一个字符串并输出,

    setlocale(LC_ALL, "Chinese_China.936");
    //system("chcp 936"); 
    
    std::wstring ws = L"!";
    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;

如果你运行它没有system("chcp 936");,转换后的字符串是“£¡”而不是“!”。如果使用 system("chcp 936");,结果在控制台项目中是正确的。

但是在我基于 Dialog 的项目中,system("chcp 936")没用,即使它可以工作,我也不能使用它,因为它会弹出一个控制台。

PS:IDE 是 Visual Studio 2019,我的源代码以带有签名的 UTF-8 格式存储。 我的操作系统语言是英语,非 unicode 程序的语言是英语(美国)。

编辑:有趣的是,即使使用“en-US”语言环境,“!”也可以转换为 ASCII“!”。

但我不知道在基于对话框的项目中“£¡”的位置。

语言环境有两点需要考虑:

  • 你必须告诉程序在将 unicode 字符转换为普通字节时应该使用什么字符集(这是 setlocale 的作用)
  • 您必须告诉 终端 它应该呈现什么字符集(这是 Windows 控制台中 chcp 的作用)

第一点取决于您在程序中使用的语言和可选库(这里是 C++ 语言和标准库)

第二点取决于控制台应用程序和底层系统。 Windows 控制台使用 chcp,您将在其中找到 other post 如何在类 Unix 系统中配置 xterm

找到原因了,wstring-to-string的转换没问题,问题是我用CA2T转换中文标点符号失败了。所以最后在UI中显示了“£¡”。

通过 mbstowcswcstombs 的对应物,它会起作用。