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

时间:2016-03-26 00:50:56

标签: c++ winapi wchar-t wchar

我试图用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的空终止。

1 个答案:

答案 0 :(得分:2)

如果文本文件是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];

或同等的。