gpt4 book ai didi

c++ - 为什么我在使用 WideCharToMultiByte 时会得到错误的字符数组?

转载 作者:行者123 更新时间:2023-11-28 00:09:01 29 4
gpt4 key购买 nike

Windows 7、Visual Studio 2015。

#ifdef UNICODE
char *buffer = NULL;
int iBuffSize = WideCharToMultiByte(CP_ACP, 0, result_msg.c_str(),
result_msg.size(), buffer, 0, NULL, NULL);

buffer = static_cast<char*>(malloc(iBuffSize));
ZeroMemory(buffer, iBuffSize);

WideCharToMultiByte(CP_ACP, 0, result_msg.c_str(),
result_msg.size(), buffer, iBuffSize, NULL, NULL);

string result_msg2(buffer);
free(buffer);

throw runtime_error(result_msg2);
#else
throw runtime_error(result_msg);
#endif

result_msg 对于 unicode 是 std::wstring,对于多字节字符集是 std::string

对于多字节字符集:

enter image description here

对于 Unicode 字符集:

enter image description here

最佳答案

您将输入字符串大小指定为 result_msg.size(),其中不包括终止空字符,因此输出也不会以空终止。但是,当您将 buffer 转换为 string 时,您并未指定 buffer 的大小,因此 string 构造函数需要一个空终止符。如果没有该终止符,它将从周围的内存中获取数据,直到遇到空字节(或出现内存访问错误)。

要么使用 result_msg.size() + 1 作为输入大小,要么指定 -1 作为输入大小,让 WideCharToMultiByte() 自动确定输入尺寸。两种方法都将在输出中包含空终止符。

或者,继续使用 result_msg.size() 作为输入大小,并在将 buffer 转换为 时使用 iBuffSize 的值code>string,则不需要空终止符:

string result_msg2(buffer, iBuffSize);

关于c++ - 为什么我在使用 WideCharToMultiByte 时会得到错误的字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018418/

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