Win32 API 如果第二个参数是 LPWSTR,Visual C++ ReadFile() 函数会生成乱码

Win32 API Visual C++ ReadFile() function generates gibberish if second parameter is LPWSTR

我试图用 Win32 制作一个非常基本的文本编辑器,它能够读取文件并将编辑控件的文本更改为它。我希望它能够处理所有语言的字符,所以我尝试使用 LPWSTR 作为 ReadFile() 的第二个参数,如下所示:

HANDLE file = CreateFile(_T("D:\C++ Stuff\Testing.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD fileSize = GetFileSize(file, NULL);
LPWSTR buffer = (LPWSTR)GlobalAlloc(GPTR, fileSize + 1);
DWORD read;
ReadFile(file, buffer, fileSize, &read, NULL);
MessageBox(NULL, buffer, NULL, NULL);
GlobalFree(buffer);

但是 MessageBox 出现了一堆乱码!如果我使用调试模式并向 buffer 添加手表,它仍然是一样的。打开的文件是否包含 UTF-16 编码的字符都没有区别。这是正常的吗?如果是,是否有其他方法可以将文件读入 LPWSTR?如果不是,如何解决? 我正在为这个项目使用 Visual Studio 2015。

P.S。提供的代码只是一个示例。在实际代码中,我检查了 CreateFile()GetFileSize()GlobalAlloc()ReadFile() 是否失败以及 buffer.[=21 的空终止=]

如果文本文件在 ASCII/UTF-8 中,那么将其作为原始字节读入宽字符 (LPWSTR) 将导致非常奇怪的垃圾,因为例如字符 ABCD(ASCII/UTF-8 编码为 65、66、67、68)将被编码为两个宽字符值 0x4142 0x4344)。

检查你的文本文件是ASCII/UTF-8还是宽字符,注意Windows一般会加两个其他平台不支持的unicode指示字节(0xFFFE),所以即使你的文本文件是宽字符,您可能会从指示符字节中看到奇怪的字符。

如果您需要 unicode,并且无法更改您的项目以使用 ASCII (LPSTR),那么您可以读入一个字节数组,然后使用 Windows 提供的 COM 库函数 MultiByteToWideChar 进行转换,或者您可以读取每个字节并强制转换为 wchar_t,然后存储在您的

for(int position = 0; position < filesize; position++)
    buffer[position] = (wchar_t)byte_buffer[position];

或同等学历。