|
一开始想要在ue里面用它自己的http框架起一个http服务器,接受一些post请求来做简单控制。从js带过来的习惯,字符串统一用utf-8来处理中文,在接收消息时,便遇到了往FString转换的问题。
吐槽下自己的学习习惯,面向搜索引擎,便搜到了UTF8_TO_TCHAR TCHAR_TO_UTF8这两个宏。
FString Param(Request.Body.Num(), UTF8_TO_TCHAR(reinterpret_cast<const char*>(Request.Body.GetData())));此处埋坑,按下不表
后来由于一些业务需求需要使用udp直接收发消息,发送接受用json来序列化反序列化。屎山上的已有代码是拿到TArray<u8>直接丢给了FString,本来没有显示中文的需求,还没有暴雷,直到有一天,发来了一个带中文的消息,怎么也收不到。随机开启菜鸟编程方式,开启调试一步步跟随,发现了TArray<u8>直接丢给了FString这件事情,这不肯定收不到么。联系上文,搞定utf-8还不简单,直接抄过来。
结果。。。带了中文的json转换怎么都会失败,这个FString的长度怎么都不对劲,UTF8_TO_TCHAR TCHAR_TO_UTF8这两个宏只给了转换之后的指针,没有给长度,这可怎么办。直到跟进UTF8_TO_TCHAR这个宏的源文件(再次吐槽,能看源码而不看的自己)
// These should be replaced with StringCasts when FPlatformString starts to know about UTF-8.
typedef TStringConversion<FTCHARToUTF8_Convert> FTCHARToUTF8;
typedef TStringConversion<FUTF8ToTCHAR_Convert> FUTF8ToTCHAR;
// Usage of these should be replaced with StringCasts.
#define TCHAR_TO_ANSI(str) (ANSICHAR*)StringCast<ANSICHAR>(static_cast<const TCHAR*>(str)).Get()
#define ANSI_TO_TCHAR(str) (TCHAR*)StringCast<TCHAR>(static_cast<const ANSICHAR*>(str)).Get()
#define TCHAR_TO_UTF8(str) (ANSICHAR*)FTCHARToUTF8((const TCHAR*)str).Get()
#define UTF8_TO_TCHAR(str) (TCHAR*)FUTF8ToTCHAR((const ANSICHAR*)str).Get()这两个宏只是对TStringConversion的一个包装,在这个类里面一看,他有个Length的成员函数
/**
* Length of the converted string.
*
* @return The number of characters in the converted string, excluding any null terminator.
*/
FORCEINLINE int32 Length() const
{
return StringLength;
}那么。。。一气呵成,测试通过,下面两个函数留下来以后需要转换时候拷贝。
FString SomeClass::UDPBytesToString(const TArray<uint8>& bytes)
{
FUTF8ToTCHAR Convert(reinterpret_cast<const char*>(bytes.GetData()));
FString res(Convert.Length(),Convert.Get());
return res;
}
TArray<uint8> SomeClass::UDPStringToBytes(FString string)
{
FTCHARToUTF8 Convert(*string);
TArray<uint8> output(reinterpret_cast<const uint8*>(Convert.Get()), Convert.Length());
return output;
}最后再回忆一下上面埋得坑
FString Param(Request.Body.Num(), UTF8_TO_TCHAR(reinterpret_cast<const char*>(Request.Body.GetData())));之前这样写以为自己搞定了utf-8,结果这个消息处理根本没发送过中文,不然迟早暴雷,FString的这个构造函数的第一个参数,不传还好,第二个参数既然是wchar,第一个参数就是wchar的长度,结果自己一开始怎么理解的,居然传递的是u8的长度,结果构造后的FString,必然会多一些奇怪的东西出来。
回过头来看一下,作为局外人来看,发现知识点很简单,问题的解决方式也很自然。当时在局中只是又是怎样抓耳挠腮,断断续续两天才暂时解决问题(可能还有更优雅的实现),更可怕的是,期间误以为解决了问题,埋下了深坑。看别人的避坑文章,形形色色的坑,自己遇到过的看了感慨万千,没遇到过的又不知所云。所以不指望能帮上谁,暂且做一个自己踩坑的记录罢了。 |
|