起因
近期项目需要使用nanomsg通信,所以将nanomsg库导入ue4,将nanomsg的常用方法写入蓝图函数库。使用ue4作为server发数据,c++写了client收数据。发现发送的FString长度>127,c++ client出现乱码。
过程
先怀疑是nanomsg的buffer设置不对。调查发现pub/sub模式没有设置buffer大小,并且使用c++的server和client,发送和接收长一点的信息,都没问题。
然后怀疑是ue4发送出了问题。发一个固定的较长的const char*没有问题,但使用TCAHR_TO_ANSI和TCHAR_TO_UTF8,长度大于127都会出现接收到乱码。怀疑是TCAHR_TO_ANSI和TCHAR_TO_UTF8用出了问题。搜索相关问题,只有ue4论坛中有一人提到了,长度>127会有问题,但并没有解答。
其实官方文档对此有专门的提示,但不踩坑是不会注意到的。文档说明了:
这些宏声明的对象的生存期非常短。它们旨在用作功能的参数。您不能将变量分配给转换后的字符串的内容,因为该对象将超出范围,并且该字符串将被释放。
所以不应该这样使用,而我刚好犯了这个错误:
const char* SomePointer=TCHAR_TO_ANSI(SomeUnicodeString);
应该这样用:
SomeApi(TCHAR_TO_ANSI(SomeUnicodeString));
我之前的代码:
char* MyChar=TCHAR_TO_UTF8(*Content);
int bytes=nn_send(Sock,MyChar,Content.Len()+1,0);
修改之后的代码:
int bytes=nn_send(Sock,TCHAR_TO_UTF8(*Content),Content.Len()+1,0)
之后再发送的数据,就不会有乱码了。
结论
不要试图获取TCHAR_TO_UTF8或TCHAR_TO_ANSI的指针,因为他很快就失效了。直接使用。
参考
- 疑问: https://forums.unrealengine.com/development-discussion/c-gameplay-programming/38026-can-the-type-of-fstring-be-converted-to-char-in-ue4-c
- 解答: https://answers.unrealengine.com/questions/563141/index.html
- 官方文档:https://docs.unrealengine.com/en-US/Programming/UnrealArchitecture/StringHandling/FString/index.html