【UE】字符串及相互转化方式解析
UE常见的3种字符串
C++支持两种字符串编码:ANSI(char)和宽字符的Unicode(wchar_t),但出于效率考虑,UE并没有直接使用C++的原生字符串类型
UE使用TEXT
宏来根据当前运行的平台使用适宜的字符串类型。故应尽可能使用这个宏包裹字串。
FName
基于哈希表实现,其本质是一个ID。
大小写不敏感,存储和查找非常迅速,不可修改,相同的内容只存一份
FText
基于TSharedRef<ITextData>
实现,因此copy的效率较高
大小写敏感,不可修改,具有本地化功能 故Slate上使用的文本类型都是FText
FString
基于TArray<TCHAR>
实现
大小写敏感,可以修改但意味着更大的开销
开销而言FName最轻,FString最重。
字符串之间的转换
from to | FString | FName | FText |
---|---|---|---|
FString | TestFName=FName(TestFString) | TestFText=FText::FromString(TextString) | |
FName | TestFString=TestFName.ToString() | TestFText=FText::FromName(TestFName) | |
FText | TestFString=TestFText.ToString() | none |
其中从FText到FName没有直接的转换函数,可以通过FString转一手
但注意这里的转换都是有损的(lossy):各字符串的特点,转成其它类型以后将不再拥有(如FText的本地化功能和FName的大小写不敏感)
此外FString也可以与std::string, const TCHAR*互换:
std::string Str = "str";
FString TestFString(str.c_str());
std::string NewStr(TCHAR_TO_UTF8(*TestFString));
const TCHAR* ConstTchar = *TestFString;