问题是针对 macOS 平台上 clang 的。
先在 Windows 平台上 VS 中作如下测试(GCC 也试了一下):
1、不设置本地化策略集且源代码不含宽字符字面值
#include <iostream>
//#include <string>
using namespace std;
int main()
{
wchar_t wstr[100];
//ios_base::sync_with_stdio(false); //有没有这一行,GCC都无法处理宽字符
//wstring wstr;
wcin >> wstr; // 输入字符“中文”
wcout << wstr << endl; //正常输出
return 0;
}
看起来,此时 wchar_t、wcin、wcout 类似于窄字符方式在工作,
为什么不需要为wcout设置本地化策略集也能工作?
2、设置本地化策略集且源代码含宽字符字面值
#include <locale>
#include <iostream>
//#include <string>
using namespace std;
int main()
{
locale myloc(locale( "" ));
//ios_base::sync_with_stdio(false); //这一行才能让GCC处理宽字符
wcout.imbue( myloc ); //必须设置
wchar_t wstr[100]=L"中文";
//wstring wstr;
wcout << wstr << endl;
return 0;
}
教科书的标准示例。
3、设置本地化策略集且源代码不含宽字符字面值
#include <locale>
#include <iostream>
//#include <string>
using namespace std;
int main()
{
locale myloc(locale( "" ));
//ios_base::sync_with_stdio(false); //这一行才能让GCC处理宽字符
//wcin.imbue( myloc ); //这一行才能让中文字符正常输出
wcout.imbue( myloc );
wchar_t wstr[100];
//wstring wstr;
wcin >> wstr;
wcout << wstr << endl;
return 0;
}
与情形1相对,wcin、wcout 的策略集是怎么定的?
回到 macOS 的 clang,发现情形1、2工作;情形3怎么弄,都不能工作,特别是 >> 的输入结束方式也不适用 wcin,不知道为啥?
换个方式的问法就是:有没有更统一地宽字符流输入输出的处理方式?
--
修改:easior FROM 61.155.142.*
FROM 61.155.142.*