Обратите внимание, что вы используете потоки C. C-потоки имеют очень особое качество, называемое «ориентация». Поток является либо неориентированным, либо широким, либо узким. Ориентация определяется первым выходом из к любому потоку (см http://en.cppreference.com/w/cpp/io/c для резюме потоков CI/O)
В вашем случае, stdout
начинается неориентированным, и выполнив первую printf
, вы устанавливаете его узким , После того, как он узкий, он застрял узким, и wprintf
не работает (проверьте его код возврата!). Единственный способ изменить поток C - freopen
, который не работает с stdout. Вот почему 3 и 4 не печатались.
Различия между 1 и 3 заключаются в том, что 1 представляет собой узкую функцию вывода, которая использует спецификатор узких строк% s: он считывает байты из массива символов и отправляет байты в поток байтов.3 представляет собой широкую выходную функцию с узкоспециализированным спецификатором преобразования% s: сначала считывает байты из массива char и mbtowc
s их в wchar_t
s, а затем отправляет wchar_t
s в широкий поток, который затем wctomb
s их в байты или многобайтовые последовательности которые затем вставляются в стандартное значение с write
Наконец, если widestr находится в utf16, вы должны использовать Windows, и все ставки отключены; поддержка ASCII на этой платформе очень мало. Вы можете также использовать WinAPI и использовать его с помощью стандартного C++ 11 для некоторых Unicode-приложений и даже делать этот вывод C с помощью магических слов _setmode(_fileno(stdout), _O_U16TEXT);
, которые обсуждались достаточно раз)
Вы прочитали документация? В частности, [cstdio] (http://www.cplusplus.com/reference/cstdio/)? –
«widestr is in utf16» подразумевает, что вы используете Windows (более Unicode-совместимые системы используют UTF-32 по умолчанию для широких строк). Есть много тайных обручей, чтобы прыгать, если вы хотите сделать что-либо за пределами ASCII в системе WIndows, используя стандартные C++ или C. Вы можете также использовать WinAPI и использовать его. – Cubbi
НЕ ДАЙТЕ В МИКРОСОФТ-СТУПИДНОСТИ. Спасите себя от боли и напишите свою собственную библиотеку строк. Для любви к Богу НЕ используйте преобразования макросов Windows и другое безумие, поверьте мне, это ужасно, и в замешательстве всевозможные ошибки ползут. – Owl