如何使用读取文件修复乱码文本?

How to fix garbled text with using ReadFile?

本文关键字:码文 文本 文件修复 何使用 读取      更新时间:2023-10-16

我正在制作一个Win32应用程序。 使用"ReadFile"检索用Unicode编写的文本文件。 要在编辑框中打印。

const TCHAR FILE_DIRECTORY[] = TEXT("data/");
const TCHAR FILE_LIST[][MAX_LOADSTRING] = { 
TEXT("fputs_fgets.h"), TEXT("fprintf_fscanf.h"), 
TEXT("fprintfs_fscanfs.h"), TEXT("fread_fwrite.h"), TEXT("freads_fwrite.h") };
const int FILE_NAME_LENGTH = _tcslen(FILE_LIST[idx]);
const int FILE_DIRECTORY_LENGTH = _tcslen(FILE_DIRECTORY);
TCHAR* filePath = (TCHAR*)calloc(FILE_NAME_LENGTH + FILE_DIRECTORY_LENGTH + 1, sizeof(TCHAR));
_tcscpy_s(filePath, FILE_DIRECTORY_LENGTH + 1, FILE_DIRECTORY);
_tcscat_s(filePath, FILE_NAME_LENGTH + FILE_DIRECTORY_LENGTH + 1, FILE_LIST[idx]);
HANDLE file = CreateFile(filePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD fileSize = GetFileSize(file, NULL);
DWORD dwRead;
if (editText != NULL)
free(editText);
editText = (TCHAR*)calloc(1, fileSize + 1);
ReadFile(file, editText, fileSize, &dwRead, NULL);
CloseHandle(file);
free(filePath);

但是,输出背面有一些奇怪的字符。

printf("y좌표(정수): %dn", point.y);
}
fclose(file);
}ﴀ﷽ý

我该如何解决它? 谢谢。

假设您的文件是 UTF-16 并且您正在使用_UNICODE定义的文件进行编译(假设以正确读取文本的其余部分这一事实为合理性(,在以下行中:

editText = (TCHAR*)calloc(1, fileSize + 1);

如果你想利用calloc所做的清零来获取以 NUL 结尾的字符串,你实际上应该做fileSize + sizeof(TCHAR)。就像现在一样,你有一个宽字符串,其最后一个字符只有低字节到零,所以你的代码的其余部分继续读取垃圾,直到它碰巧找到两个零的实心字节(完全对齐(。

请注意,我通常对此代码非常怀疑 - 如果您使用TCHAR则意味着您想同时使用 ANSI (TCHAR == char( 和 Unicode (TCHAR ==wchar_t( 进行编译,改变您解释外部文件字节的方式是一个有争议的想法。