Рассмотрим следующий фрагмент кода, скомпилированного в качестве консольного приложения на MS Visual Studio 2010/2012 и выполняется на Win7:Почему некоторые символы Unicode приводят к отказу std :: wcout в консольном приложении?
#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 заявление «привет» (вместо того, чтобы что-то вроде «привет тест?! ") Второй вывод wcout ничего не выводит.
Это как если бы 0xf021 (и другие?) Символы Unicode приводили к сбою wcout.
Этот символ Юникода, 0xf021 (кодированный как UTF-16), является частью «Частной области использования» на базовой многоязычной плоскости. Я заметил, что приложения Windows Console не имеют расширенной поддержки символов Unicode, но обычно каждый символ, по крайней мере, представлен символом по умолчанию (например, «?»), Даже если нет поддержки для отображения определенного глифа.
Что заставляет поток наружного воздуха задыхаться? Есть ли способ сбросить его после входа в это состояние?
Вы можете попробовать 'imbue'ing поток с utf16 фаской. Не знаю, если это действительно сработает. –
Пробовал это, не смог заставить его работать. 'wcout' использует фасет для преобразования широкой строки в последовательность байтов (что для' codecvt_utf16' в основном не-op), а затем записывает их с помощью 'fwrite' по одному байту за раз, по причинам, которые меня избегают. Без '_setmode' вы получаете по одному символу для каждого байта, включая глиф« неизвестный символ »для нулей. С '_setmode' вы получаете подтверждение внутри' fwrite', жалуясь на то, что его попросят написать нечетное количество байтов. –
Крысы. Спасибо за попытку. –