You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:18:03