如何在基于对话框的项目中使用 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中显示了“£¡”。
通过 mbstowcs
,wcstombs
的对应物,它会起作用。
下面的代码是将一个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中显示了“£¡”。
通过 mbstowcs
,wcstombs
的对应物,它会起作用。