【UE4】FString TCHAR_TO_UTF8宏的一些坑

本文揭示了TCHAR_TO_UTF8宏在处理FString到UTF8格式转换时的潜在问题,尤其是在跨函数调用时可能导致的野指针和乱码问题。通过实例展示了正确的使用方法,包括如何利用std::string确保char*的有效性和数据完整传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  TCHAR_TO_UTF8可以将FString转为UTF8格式的字符串,例如用char*接收

FString String;
char* UTF8String = TCHAR_TO_UTF8(*String);

  这里需要注意的是TCHAR_TO_UTF8宏仅仅是构造了一个临时对象,此对象会在函数作用域后就被释放,UTF8String 也将变为野指针,一般情况下转换完成后会直接使用UTF8String 作为参数传给其他函数或在本函数内使用,所以不会出问题。

  但如果不在作用域内使用,例如UTF8String 作为WM_COPYDATA内容传给了例如SendMessage函数的数据,则接收方收到的结果直接用UTF8_TO_TCHAR转回FString时就会出现字符串后面跟了一堆乱码,原因就是UTF8String 已经被释放,UTF8_TO_TCHAR不知道有字符串到底有多长,会把内存读乱。

//发送
void SendMsg(CWnd* pWnd, char* UTF8String)//UTF8String = '你好世界'
{
	COPYDATASTRUCT cpd; 
	cpd.dwData = 0;
	cpd.cbData = strlen(UTF8String);
	cpd.lpData = UTF8String;
	SendMessage(pWnd, WM_COPYDATA, 0, (LPARAM)&cpd);//pWnd是接收方句柄
}
//接收
bool OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
	FString String = UTF8_TO_TCHAR((char*)pCopyDataStruct->lpData);//String  = '你好世界XXX一堆乱码'
	return true;
}

  解决方案很简单,就是解决char*的有效性,比较保险的方式是例如std::string作为TCHAR_TO_UTF8的左参,因为会有构造过程,string一定是有效的。接收方也暂用std::string转换一下lpData,再转成FString,如下改造上述代码:

void SendMsg(CWnd* pWnd, char* UTF8String)
{
	std::string Str(UTF8String);
	COPYDATASTRUCT cpd; 
	cpd.dwData = 0;
	cpd.cbData = Str.length();
	cpd.lpData = Str.c_str();
	SendMessage(pWnd, WM_COPYDATA, 0, (LPARAM)&cpd);//pWnd是接收方句柄
}
//接收
bool OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
	std::string Str((char*)pCopyDataStruct->lpData, pCopyDataStruct->cbData );
	FString String = UTF8_TO_TCHAR(Str.c_str());
	return true;
}

  经改造后数据就正确了,具体的坑就是TCHAR_TO_UTF8()宏构造了一个临时对象,在使用时一定要注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值