如何在C语言中正确打印UTF-8字符(如U+0C9A)?终端输出异常求助
在Windows终端用C语言打印UTF-8字符的解决方案
Windows终端(CMD、PowerShell)的默认编码和Locale设置与POSIX系统不同,直接使用en_US.UTF-8会导致UTF-8字符无法正常输出,以下是针对性的解决步骤:
修正Locale参数:Windows不支持
en_US.UTF-8格式的Locale名称,需替换为系统兼容的取值,比如".UTF-8"或"English_US.UTF-8"。同时建议检查setlocale的返回值,确认Locale设置成功:const char* locale = setlocale(LC_CTYPE, ".UTF-8"); if (locale == NULL) { printf("Locale设置失败\n"); return; }强制控制台使用UTF-8输出:Windows终端默认使用非UTF-8代码页(如GBK),需切换到UTF-8(代码页65001)。可以在程序中调用Win32 API自动设置,需包含
<windows.h>头文件:SetConsoleOutputCP(CP_UTF8);确保终端字体支持目标字符:字符
ಚ(U+0C9A)属于Devanagari字符集,需终端使用支持该字符的字体,比如Segoe UI、Consolas(新版本)或专门的Devanagari字体。可通过终端属性窗口切换字体。
修改后的完整代码
#include <stdio.h> #include <wchar.h> #include <locale.h> #include <windows.h> void print_utf8_char() { // 设置UTF-8 Locale const char* locale = setlocale(LC_CTYPE, ".UTF-8"); if (locale == NULL) { printf("Locale设置失败\n"); return; } // 设置控制台输出为UTF-8代码页 SetConsoleOutputCP(CP_UTF8); wchar_t ch = 0x0C9A; // U+0C9A 对应字符ಚ wprintf(L"Character for U+0C9A: %lc\n", ch); } int main() { print_utf8_char(); return 0; }
额外说明
- 编译时需使用支持宽字符的编译器(如MSVC、MinGW),无需额外特殊参数;
- 若手动运行程序前已执行
chcp 65001切换代码页,程序中可省略SetConsoleOutputCP调用,但建议保留以提升兼容性。
内容的提问来源于stack exchange,提问作者Moldovan Sanyi
相关产品推荐
相关产品推荐

