考虑以下代码片段,在 MS Visual Studio 2010/2012 上编译为控制台应用程序并在 Win7 上执行:
#include "stdafx.h"
#include <iostream>
#include <string>
const std::wstring test = L"hello\xf021test!";
int _tmain(int argc, _TCHAR* argv[])
{
std::wcout << test << std::endl;
std::wcout << L"This doesn't print either" << std::endl;
return 0;
}
第一个 wcout 语句输出“hello”(而不是类似“hello?test!”)第二个 wcout 语句不输出任何内容。
就好像 0xf021 (和其他?)Unicode 字符导致 wcout 失败。
这个特殊的 Unicode 字符 0xf021(编码为 UTF-16)是基本多语言平面中“私人使用区”的一部分。我注意到 Windows 控制台应用程序没有广泛支持 Unicode 字符,但通常每个字符至少由默认字符表示(例如“?”),即使不支持呈现特定字形。
是什么导致 wcout 流阻塞?进入这种状态后有没有办法重置它?