#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
?提前致谢。
最佳答案
可以将空宽字符写为wchar_t(0)
或L'\0'
。
您观察到的不同行为是因为cout
和wcout
是文本流。根据cppreference的规定,您只能在文本流上使用可打印字符\t
和\n
。向文本流发送空字符可能会导致意外结果。
如果要在Windows中将cout
用作二进制流,可以使用一些技巧see here以获得想法。
我不确定这些hacks是否适用于wcout
;但是从过去的经验来看,编译器中wcout
支持的状态令人怀疑,我发现仅使用stdout
并使用构面或显式函数等进行任何所需的翻译就更加可靠。