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()宏构造了一个临时对象,在使用时一定要注意。