Официально ли Microsoft Microsoft поддерживает использование SetConsoleOutputCP (CP_UT8) для вывода текста Unicode на консоль и перенаправленного вывода?
Конечно, это явно не поддерживается, но трудно сказать, что считается «поддерживаемым» здесь. Это область, где документация безнадежна и полностью отсутствует.
На практике возникают серьезные ошибки при WriteFile
вводе- выводе, в том числе , когда консоль находится на другом конце, а ее кодовая страница установлена ??на 65001. В общем, API-интерфейсы ввода-вывода Win32 (и подпрограммы MSDCRT stdlib, построенные поверх них) fail, возвращая количество байтов, записанных или прочитанных, которые фактически являются числами символов.
В вашем примере это не имеет значения, потому что вы игнорируете lpNumberOfBytesWritten
outparam WriteFile
, но обычно, когда вы используете символы, отличные от ASCII, неправильные подсчеты приведут к искаженному повторному выходу и зависают, ожидая большего количества данных при попытке чтения ввода.
Это ошибка в консоли (conhost): она имеет специальную поддержку для передачи правильных отсчетов обратно в Windows для двухбайтовых кодовых страниц, которые используются в качестве кодовых страниц по умолчанию для любого языка установки (a € ~ язык для не-Unicode-приложений), но не для других многобайтовых кодировок общего назначения.
Как было связано с @IInpectable, по крайней мере, одна часть Microsoft специально отказалась исправить один видимый аспект этой проблемы, хотя и не бит Microsoft, которому принадлежит первопричина. В любом случае, к сожалению, это не похоже на то, что эта давняя и глубоко разочаровывающая проблема придет в ближайшее время.
// Могу также использовать WriteConsoleA, но у этого есть недостатки с перенаправлением вывода
Да, общий подход заключается в том, чтобы определить, является ли stdout самой консолью (например, использование _isatty
) и веткой WriteConsoleW
вместо этого в этом случае.