在文本文件上调用ReadFile,得到了奇怪的(日文?)字符

时间:2011-03-12 14:37:28

标签: c++ c io

我使用下一个代码来读取文件中的所有元素,其中句柄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之类的东西

4 个答案:

答案 0 :(得分:7)

现代IDE默认使用Unicode应用程序,这意味着_TCHAR实际上是wchar_tReadFile()适用于简单字节,如果您使用它直接填充_TCHAR数组,您将获得解释为UTF-16 Unicode的8位字符。这些通常显示为CJK(中国/日本/韩国)字形。

您有三种选择:

  • 将您的程序转换为非Unicode
  • 使用包含Unicode文本(UTF-16编码)或
  • 的文件
  • 从文件读取到char数组,然后使用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 现在是可读的形式。

相关问题