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

Windows平台C程序调用printf无法打印日文字符如何解决

Windows下C程序宽字符打印日文无输出的解决方法

问题复现代码

#include <locale.h>
#include <stdio.h>
#include <wchar.h>
 
 
int main() {
  setlocale(LC_ALL, "");
  wchar_t test = L'づ';

  printf("%ls", L"\x3065");
  printf("%lc", test);

  return 0;     
}

上述代码预期输出づづ,实际运行时两处打印语句均无内容输出。

根因说明

  • Windows平台的C运行时setlocale(LC_ALL, "")默认绑定系统当前ANSI代码页,简体中文系统对应代码页936(GBK),该代码页不包含日文平假名づ的映射,宽字符转窄字符输出时直接转码失败,导致输出函数提前返回、无内容打印。
  • Windows控制台输出流默认是窄字符模式,未显式切换模式时,printf搭配%ls/%lc的宽字符格式化逻辑存在兼容缺陷,无法正确将UTF-16编码的宽字符转换为控制台可识别的输出序列。
  • 部分旧版Windows控制台默认字体不支持日文字形,会导致字符显示为方块,但该问题不会造成完全无输出。

修复方案

按以下步骤修改代码即可正常输出:

  1. 替换locale设置参数,不要使用空字符串自动匹配代码页,直接指定UTF-8 locale:将setlocale(LC_ALL, "")修改为setlocale(LC_ALL, ".UTF8"),该配置在Windows 10 1903及以上版本、新版UCRT运行时中均支持。
  2. 引入<fcntl.h>和<io.h>头文件,调用_setmode接口将标准输出流切换为宽字符输出模式,避免流模式和格式化参数不匹配。
  3. 开启宽字符流模式后,统一使用wprintf进行宽字符输出,不要混用printf窄字符输出接口,防止流状态混乱。

修复后的可运行代码:

#include <locale.h>
#include <stdio.h>
#include <wchar.h>
#include <fcntl.h>
#include <io.h>

int main() {
  setlocale(LC_ALL, ".UTF8");
  // 将标准输出切换为UTF-16宽字符模式,适配Windows控制台原生宽字符输出逻辑
  _setmode(_fileno(stdout), _O_U16TEXT);

  wchar_t test = L'づ';
  wprintf(L"%ls", L"\x3065");
  wprintf(L"%lc", test);

  return 0;     
}

额外排查项

  • 若运行后仍无输出,可先在当前控制台窗口执行chcp 65001临时切换代码页为UTF-8,再运行程序验证。
  • 若输出显示为方块而非日文,右键控制台标题栏打开属性页,将字体切换为MS Gothic、Yu Gothic等支持日文显示的字体即可。
  • 若使用MinGW编译环境,请升级到最新版MinGW-w64,旧版MinGW的_setmode宽字符模式存在实现bug,会导致输出异常。

内容的提问来源于stack exchange,提问作者Breno Macêdo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:27:30