使用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
相关产品推荐
相关产品推荐

