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

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;
}

关键注意事项

  1. 文件打开模式:必须使用"r,ccs=UTF-8",明确告知C标准库将文件的UTF-8编码转换为Windows原生的UTF-16宽字符(wchar_t)。
  2. 输出函数匹配:宽字符字符串必须用wprintf、fwprintf等宽字符输出函数,不能用printf(会截断宽字符)。
  3. 缓冲区循环读取:fgetws一次只能读取一行或填满缓冲区,需循环调用才能读取完整文件内容。
  4. VS项目设置:无需修改字符集设置(默认的「使用多字节字符集」或「使用Unicode字符集」都兼容),代码中显式使用宽字符函数即可。

内容的提问来源于stack exchange,提问作者Vovchisk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:27:37