Windows下C语言fopen读取UTF-8文件崩溃及输出异常问题求助
Windows下C语言读取UTF-8文件的问题修复
问题根源分析
- 不用
ccs=UTF-8时乱码:Windows默认以本地编码(如GBK)读取文件,UTF-8编码的多字节字符无法被正确解析,导致乱码。 - 使用
ccs=UTF-8崩溃(错误码-1073740791):该错误对应STATUS_STACK_BUFFER_OVERRUN,核心原因是窄字符缓冲区与宽字符流不匹配——指定ccs=UTF-8后,文件流会切换为宽字符(UTF-16)模式工作,若仍用char类型缓冲区读取,宽字符数据会溢出窄缓冲区,触发VS的栈溢出安全检查。 - 改用
wchar_t和fgetws仅输出%:大概率是误用了printf而非宽字符输出函数(wprintf),printf会把wchar_t字符串的第一个宽字符(%的宽字符为0x0025)当成窄字符串,读取到0x00就终止,因此只输出%。
正确实现代码
以下是适配Windows 11+VS2022的宽字符读取方案,可完整读取并输出UTF-8多语言字符:
#include <stdio.h> #include <wchar.h> #include <errno.h> int main() { // 以宽字符模式打开UTF-8文件,指定ccs=UTF-8自动转码为UTF-16 FILE* fp = fopen("test.txt", "r,ccs=UTF-8"); if (!fp) { wprintf(L"文件打开失败,错误码:%d\n", errno); return 1; } wchar_t buf[1024]; // 循环读取每一行,直到文件结束 while (fgetws(buf, sizeof(buf)/sizeof(wchar_t), fp)) { // 用wprintf输出宽字符字符串 wprintf(L"%ls", buf); } // 检查读取过程是否出错 if (ferror(fp)) { wprintf(L"文件读取出错,错误码:%d\n", errno); } fclose(fp); return 0; }
关键注意事项
- 文件打开模式:必须使用
"r,ccs=UTF-8",明确告知C标准库将文件的UTF-8编码转换为Windows原生的UTF-16宽字符(wchar_t)。 - 输出函数匹配:宽字符字符串必须用
wprintf、fwprintf等宽字符输出函数,不能用printf(会截断宽字符)。 - 缓冲区循环读取:
fgetws一次只能读取一行或填满缓冲区,需循环调用才能读取完整文件内容。 - VS项目设置:无需修改字符集设置(默认的「使用多字节字符集」或「使用Unicode字符集」都兼容),代码中显式使用宽字符函数即可。
内容的提问来源于stack exchange,提问作者Vovchisk
相关产品推荐
相关产品推荐

