【问题标题】:How to fix garbled text with using ReadFile?如何使用 ReadFile 修复乱码文本?
【发布时间】:2018-11-28 10:21:48
【问题描述】:

我正在制作一个 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좌표(정수): %d\n", point.y);
    }

    fclose(file);
}ﴀ﷽ý

我该如何解决? 谢谢。

【问题讨论】:

  • "Unicode" 不是字符编码。文本文件使用什么字符编码,你的程序使用什么字符编码?请记住,ReadFile 不会零终止读取的内容。
  • 输出部分怎么写?你只在这里显示了读取的部分......我怀疑错误在那里
  • @IInspectable:在 WinAPI 世界中,Unicode 应该被读取为 UTF-16。使用 TCHAR 表明该文件是 Windows Unicode(读取 UTF-16 编码)文件。 UTF-8 在 Windows 上并不常见......
  • 你为什么使用 TCHAR?
  • 不,这不是一个好主意。它的目的是支持不支持Unicode 的Windows 9x 和支持Unicode 的Windows NT 的单一源代码库。十多年来一直使用 TCHAR 并不明智。

标签: c++ winapi win32gui


【解决方案1】:

假设您的文件是 UTF-16 并且您正在使用定义的 _UNICODE 进行编译(假设您的其余文本被正确读取这一事实证明了这一点),在这一行中:

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

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

请注意,我对这段代码非常怀疑——如果你使用TCHAR,这意味着你想在 ANSI (TCHAR == char) 和 Unicode (TCHAR ==wchar_t) 中编译,这改变了如何你解释外部文件的字节是一个有争议的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多