为什么printf无法打印出中文,必须setlocal(LC_ALL,_chs_)后才可以打印中文

本文解析了VC的C运行时库(CRT)如何处理输入输出流的编码问题。CRT最终通过WriteFile进行读写,而WriteFile在控制台环境下会调用WriteConsoleA,使用当前控制台的代码页。这导致printf和wprintf必须使用ANSI编码。由于printf直接使用ANSI,可以将字符串直接传递给WriteFile;而wprintf需将Unicode字符串转换为ANSI,此过程由C运行时库的locale设置控制,默认的POSIX locale不支持汉字处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原因是vc的crt最终调用WriteFile写输入输出流,WriteFile对于控制台句柄是调用WriteConsoleA

WriteConsoleA使用当前控制台环境的代码页

因此printf和wprintf最终都得用ANSI编码调用系统服务

由于printf本身就是ansi,所以可以直接把字符串传给WriteFile

wprintf则要把unicode字符串转成ansi,此时用的locale是crt的,crt缺省的是POSIX locale,这个只有很少的功能,不能处理汉字,所以你需要调用setlocale

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值