gpt4 book ai didi

c++ - 如何读取包含 Unicode 内容的文件

转载 作者:行者123 更新时间:2023-11-30 16:51:35 24 4
gpt4 key购买 nike

如何使用 C/C++ 读取包含 Unicode 内容的文件?

我使用ReadFile函数读取包含Unicode内容的文件,但它没有真正的输出。 我想要一个包含文件所有内容的缓冲区

我使用这个代码:

#include <Windows.h>

int main()
{
HANDLE hndlRead;
OVERLAPPED ol = {0};

CHAR* szReadBuffer;
INT fileSize;

hndlRead = CreateFileW(L"file", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hndlRead != INVALID_HANDLE_VALUE)
{
fileSize = GetFileSize(hndlRead, NULL);
szReadBuffer = (CHAR*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (fileSize)*2);
DWORD nb=0;
int nSize=fileSize;
if (szReadBuffer != NULL)
{
ReadFile(hndlRead, szReadBuffer, nSize, &nb, &ol);
}
}

return 0;
}

有什么办法可以正确读取这个文件吗?

这是 nb 和 szReadBuffer:

enter image description here

这是我在 notpad++ 中的文件内容:

enter image description here

最佳答案

你的代码工作正常。它将 rdp 文件逐字读取到内存中。

您受到BOM (byte order mark)的困扰在 rdp 文件的开头。

如果您使用文本编辑器(例如记事本)查看 rdp 文件,您将看到以下内容:

screen mode id:i:2
use multimon:i:0
desktopwidth:i:2560
desktopheight:i:1600
....

如果您使用十六进制编辑器查看 rdp 文件,您将看到以下内容:

0000 FFFE 7300 6300 7200 6500 6500 6E00 2000 ..s.c.r.e.e.n. .
0008 6D00 6F00 6400 6500 2000 6900 6400 3A00 m.o.d.e. .i.d...
....

FFFE 是字节顺序标记,表示该文件是采用 Little Endian UNICODE 编码的文本文件,因此每个字符占用 2 个字节,而不是 1 个字节。

一旦文件读入内存,您将得到以下信息(0x00318479 是 szReadBuffer 指向的地址):

enter image description here

  • 顺便说一句 1:读取文件后,您应该调用 CloseHandle(hndlRead)
  • 顺便说一句 2:您不应该使用 HeapAlloc,而应该使用 malloccalloc

更正的程序:

#include <Windows.h>

int main()
{
HANDLE hndlRead;

WCHAR* szReadBuffer; // WCHAR instead of CHAR
INT fileSize;

hndlRead = CreateFileW(L"rdp.RDP", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hndlRead != INVALID_HANDLE_VALUE)
{
fileSize = GetFileSize(hndlRead, NULL);
szReadBuffer = (WCHAR*)calloc(fileSize + sizeof(WCHAR), 1); // + sizeof(WCHAR) for NUL string terminator
DWORD nb = 0;
int nSize = fileSize;
if (szReadBuffer != NULL)
{
ReadFile(hndlRead, szReadBuffer, nSize, &nb, NULL);
}

CloseHandle(hndlRead); // close what we have opened

WCHAR *textwithoutbom = szReadBuffer + 1; // skip BOM

// put breakpoint here and inspect textwithoutbom

free(szReadBuffer); // free what we have allocated
}

return 0;
}

关于c++ - 如何读取包含 Unicode 内容的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41714320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com