gpt4 book ai didi

c++ - MultiByteToWideChar 或 WideCharToMultiByte 和 txt 文件

转载 作者:行者123 更新时间:2023-11-28 03:31:08 25 4
gpt4 key购买 nike

我正在尝试编写一个可以在 EditControl 中打开和显示 ANSI 和 Unicode 的通用文本编辑器。如果我确定文本是 ANSI,是否需要重复调​​用 ReadFile()?无法弄清楚如何执行此任务。我在下面的尝试不起作用,它显示“?” EditControl 中的字符。

LARGE_INTEGER fSize;
GetFileSizeEx(hFile,&fSize);

int bufferLen = fSize.QuadPart/sizeof(TCHAR)+1;
TCHAR* buffer = new TCHAR[bufferLen];
buffer[0] = _T('\0');

DWORD wasRead = 0;
ReadFile(hFile,buffer,fSize.QuadPart,&wasRead,NULL);
buffer[wasRead/sizeof(TCHAR)] = _T('\0');

if(!IsTextUnicode(buffer,bufferLen,NULL))
{
CHAR* ansiBuffer = new CHAR[bufferLen];
ansiBuffer[0] = '\0';
WideCharToMultiByte(CP_ACP,0,buffer,bufferLen,ansiBuffer,bufferLen,NULL,NULL);
SetWindowTextA(edit,ansiBuffer);
delete[]ansiBuffer;
}
else
SetWindowText(edit,buffer);

CloseHandle(hFile);
delete[]buffer;

最佳答案

存在一些缓冲区长度错误和异常,但这是您的大问题。您错误地调用了 WideCharToMultiByte。这意味着接收 UTF-16 编码的文本作为输入。但是当 IsTextUnicode 返回 false 时,这意味着缓冲区不是 UTF-16 编码的。

以下基本上是您需要的:

if(!IsTextUnicode(buffer,bufferLen*sizeof(TCHAR),NULL))
SetWindowTextA(edit,(char*)buffer);

请注意,我已将长度参数固定为 IsTextUnicode

就其值(value)而言,我想我应该读入一个 char 缓冲区。这将消除对 sizeof(TCHAR) 的需要。事实上,我会完全停止使用 TCHAR。这个程序应该一直是 Unicode - TCHAR 是你在为 NT 和 9x 变体的 Windows 编译时使用的。我想你不再为 9x 编译了。

所以我可能会这样编码:

char* buffer = new char[filesize+2];//+2 for UTF-16 null terminator
DWORD wasRead = 0;
ReadFile(hFile, buffer, filesize, &wasRead, NULL);
//add error checking for ReadFile, including that wasRead == filesize
buffer[filesize] = '\0';
buffer[filesize+1] = '\0';
if (IsTextUnicode(buffer, filesize, NULL))
SetWindowText(edit, (wchar_t*)buffer);
else
SetWindowTextA(edit, buffer);
delete[] buffer;

另请注意,此代码不允许接收 UTF-8 编码文本的可能性。如果你想处理,你需要获取你的 char 缓冲区并使用 CP_UTF8 通过 MultiByteToWideChar 发送。

关于c++ - MultiByteToWideChar 或 WideCharToMultiByte 和 txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12607283/

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