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

使用WriteFile函数无法写入完整缓冲区的问题排查

问题:WriteFile写入Unicode文本出现截断与乱序

尝试用WriteFile向TXT文件写入Unicode文本,声明代码如下:

// For WriteFile fuction
BOOL writeFile;
LPCVOID textToWrite = L"SakyLabs: Hello, MDE.";
DWORD numberOfBytes = (DWORD)wcslen(textToWrite);
DWORD numberOfBytesWritten;

调用WriteFile的代码:

writeFile = WriteFile(createFile, textToWrite, numberOfBytes, &numberOfBytesWritten, NULL);

其中createFile来自CreateFileW调用,使用Unicode版本函数。WriteFile执行正常,但文件中仅写入:

S a k y L a b s :   H 
解决方案
  • 核心错误:字节数计算错误
    wcslen返回的是宽字符串的字符个数(每个wchar_t对应一个字符),但WriteFile的第三个参数要求传入的是字节数。Windows下UTF-16编码的宽字符占2字节,你只传入了字符数,导致实际写入的字节数仅为所需的一半,文本被截断。同时,ASCII字符的宽字符高字节为0,编辑器按ANSI解析时会把这些0字节显示为空格,出现间隔乱码。

  • 修复字节数计算
    将numberOfBytes的计算改为:

    DWORD numberOfBytes = (DWORD)(wcslen(textToWrite) * sizeof(wchar_t));
    

    sizeof(wchar_t)会返回当前平台宽字符的字节数(Windows下固定为2),确保传入正确的总字节数。

  • 可选:添加UTF-16 BOM
    如果希望记事本等编辑器能自动识别UTF-16编码,建议在写入正文前先写入UTF-16的字节顺序标记(BOM):

    wchar_t bom = 0xFEFF;
    DWORD bomBytesWritten;
    WriteFile(createFile, &bom, sizeof(bom), &bomBytesWritten, NULL);
    

    这样编辑器会自动以UTF-16编码打开文件,避免显示异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:10:46