我使用下一个代码来读取文件中的所有元素,其中句柄hFile
有效,并且其大小与GetFileSize(hFile, NULL)
一致。
_TCHAR* text = (_TCHAR*)malloc(sizeOfFile * sizeof(_TCHAR));
DWORD numRead = 0;
BOOL didntFail = ReadFile(hFile, text, sizeOfFile, &numRead, NULL);
操作之后text
是日语中的一些奇怪的东西,而不是文件的内容。
我做错了什么?
编辑: 我理解这是编码问题,但是如何将文本转换为LPCWSTR以使用WriteConsoleOutputCharacter之类的东西
答案 0 :(得分:7)
现代IDE默认使用Unicode应用程序,这意味着_TCHAR
实际上是wchar_t
。 ReadFile()
适用于简单字节,如果您使用它直接填充_TCHAR
数组,您将获得解释为UTF-16 Unicode的8位字符。这些通常显示为CJK(中国/日本/韩国)字形。
您有三种选择:
MultiByteToWideChar()
将文本转换为Unicode。如果混合Unicode和非Unicode,请注意计算正确的缓冲区大小(字节数与字符数)。
请注意,如果您调用Windows函数的ANSI版本(例如WriteConsoleOutputCharacterA
),您仍然可以在Unicode程序中使用带有Windows的窄字符。
答案 1 :(得分:2)
你得到的字符串类型错了。当您通过使用16位编码的字符类型(如定义了UNICODE的TCHAR)查看时,以8位编码编码的文件中的文本将看起来像中文。修正:
char* text = (char*)malloc(...);
您通常不得不担心用于编写文本的编码。例如,它可能是utf-8。您可以使用MultiByteToWideChar()将8位编码转换为TCHAR(真的是wchar_t)。它的第一个论点是令人烦恼的。
答案 2 :(得分:1)
您已将ANSI或UTF-8文本文件读入UTF-16字符串。
答案 3 :(得分:0)
wchar_t ReadBuff[1024];
memset(&ReadBuff, 0, sizeof(ReadBuff));
HANDLE hFile = CreateFile(szPathFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD NumberOfBytesRead = 0;
ReadFile(hFile, ReadBuff, 600, &NumberOfBytesRead, NULL);
wsprintf(ReadBuff, L"%S\0", ReadBuff);
ReadBuff
现在是可读的形式。