#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'

您观察到的不同行为是因为coutwcout是文本流。根据cppreference的规定,您只能在文本流上使用可打印字符\t\n。向文本流发送空字符可能会导致意外结果。

如果要在Windows中将cout用作二进制流,可以使用一些技巧see here以获得想法。

我不确定这些hacks是否适用于wcout;但是从过去的经验来看,编译器中wcout支持的状态令人怀疑,我发现仅使用stdout并使用构面或显式函数等进行任何所需的翻译就更加可靠。

09-09 19:32