C语言设置stdout为_O_U16TEXT模式后printf普通文本不可见如何修复
问题原因
Windows平台下的C标准库中,标准输出流stdout的模式是全局唯一的:
- 当你执行
setmode(_fileno(stdout), _O_U16TEXT)后,流被设置为UTF-16宽字符模式,仅能正确解析wprintf输出的宽字符序列 - 普通
printf输出的单字节ASCII/多字节字符会被系统判定为无效的UTF-16序列直接丢弃,因此出现普通文本不可见的问题
修复方案
下面给出三种可直接落地的解决方法:
方案1:统一使用宽字符输出(最简单,改动最小)
所有输出统一用wprintf,普通字符串前加宽字符标记L即可,不需要切换输出模式:
// 把原有的普通printf替换为wprintf wprintf(L"THIS BECOMES INVISIBLE\n"); wprintf(L"how do i make it visible???\n");
方案2:输出前动态切换流模式
需要输出普通文本时,先把stdout切回默认多字节模式,输出完要打印宽字符艺术字时再切回宽字符模式:
// 打印完宽字符艺术字后,切回普通模式 setmode(_fileno(stdout), _O_TEXT); printf("THIS BECOMES INVISIBLE\n"); printf("how do i make it visible???\n"); // 如果后续还要打印宽字符,再切回去即可 setmode(_fileno(stdout), _O_U16TEXT); wprintf(L"其他宽字符内容\n");
方案3:改用UTF-8代码页,无需宽字符函数
不需要设置_O_U16TEXT模式,直接将控制台输出代码页设为UTF-8,所有输出统一用普通printf即可:
#include <windows.h> // 需要引入这个头文件调用SetConsoleOutputCP #include <stdio.h> int main(){ // 直接设置控制台输出UTF-8代码页,不需要改stdout模式 SetConsoleOutputCP(CP_UTF8); // 艺术字转为普通UTF-8字符串,去掉L前缀,用printf打印 printf("░██████╗████████╗██╗░░░██╗██████╗░███████╗███╗░░██╗████████╗\n"); // ... 其他艺术字打印逻辑同理 // 普通文本直接用printf输出即可,无需改动 printf("THIS BECOMES INVISIBLE\n"); printf("how do i make it visible???\n"); return 0; }
内容的提问来源于stack exchange,提问作者hatzuramen
相关产品推荐
相关产品推荐

