#include <iostream>
#include <locale>
int main(int argc, char** argv) {
std::wcout.imbue(std::locale("zh_CN.UTF-8"));
std::wcout << wchar_t(0) << L"哈哈" << std::endl;
std::cout << char(0) << "haha" << std::endl;
std::cout << "---------------" << std::endl;
std::wcout.clear();
std::wcout << L"哈哈" << std::endl;
std::cout << "haha" << std::endl;
std::cout << "---------------" << std::endl;
std::wcout << L'\0' << L"哈哈" << std::endl;
std::cout << '\0' << "haha" << std::endl;
std::cout << "---------------" << std::endl;
std::wcout.clear();
std::wcout << L"哈哈" << std::endl;
std::cout << "haha" << std::endl;
return 0;
}
wchar_t(0)
和L'\0'
似乎与char(0)
和'\0'
不同,导致ostream
状态不佳。
我花了一些时间才弄清楚丢失的输出不是由语言环境设置引起的,而是由wchar_t
引起的,因为我的原始程序在某处输出了wchar_t(0)
或'\0'
。
我的问题是它们与char
版本有什么不同?以及如何正确使用空wchar_t
?
提前致谢。
答案 0 :(得分:3)
空宽字符可以写为wchar_t(0)
或L'\0'
。
您观察到的不同行为是因为cout
和wcout
是文字流。根据{{3}},您应该只在文本流中使用可打印字符\t
和\n
。向文本流发送空字符可能会产生意外结果。
如果你想在Windows中使用cout
作为二进制流,你可以做一些黑客攻击,cppreference用于创意。
我不确定这些黑客是否适用于wcout
;但根据过去的经验,编译器中wcout
支持的状态是可疑的,我发现使用stdout
并使用构面或显式函数等进行任何所需的翻译更为可靠。