对于wchar_t,char(0)或'\ 0'的等价物是什么?

时间:2018-05-16 03:57:17

标签: c++ c++11

#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

提前致谢。

1 个答案:

答案 0 :(得分:3)

空宽字符可以写为wchar_t(0)L'\0'

您观察到的不同行为是因为coutwcout文字流。根据{{​​3}},您应该只在文本流中使用可打印字符\t\n。向文本流发送空字符可能会产生意外结果。

如果你想在Windows中使用cout作为二进制流,你可以做一些黑客攻击,cppreference用于创意。

我不确定这些黑客是否适用于wcout;但根据过去的经验,编译器中wcout支持的状态是可疑的,我发现使用stdout并使用构面或显式函数等进行任何所需的翻译更为可靠。

相关问题