深入了解UE4中的FString

FString是UE4中常用的字符串類型,它不僅可以存儲文本數(shù)據(jù),還可以進行各種數(shù)據(jù)類型的轉(zhuǎn)換。本文將介紹FString的定義和使用方法,以及如何將其他數(shù)據(jù)類型轉(zhuǎn)換為FString,幫助讀者更好地理解和使用UE4中的FString。

# 01
FString的定義
通過查看UE4源碼,我們可以在FString類的聲明中看到以下代碼,即FString中的字符串本質(zhì)是TCHAR類型的數(shù)組(UE4中稱為TArray,類似于STL中的vector),并在此基礎上完成各種字符串操作。
TCHAR是一個宏定義,它用于在C/C++中表示字符類型。TCHAR的定義通常包括char和wchar_t類型,這使得代碼能夠兼容ANSI字符集和寬字符集。即當一個字符被聲明為TCHAR類型時,如果在編譯器中使用的是Unicode,則TCHAR解析為wchar_t類型。反之,則TCHAR解析為char類型,實現(xiàn)了不同編碼平臺的自動移植。
TEXT宏:在使用FString進行初始化或者賦值的時候,經(jīng)常會看到用TEXT宏包裹字符串字面量:
這里又會出現(xiàn)另一個宏TEXT,這個宏的作用和TCHAR宏本質(zhì)是一樣的,自動根據(jù)編譯器設置來選擇char類型或w_char類型,區(qū)別在于TEXT宏是作用于字符串字面量的。在UE4編碼規(guī)范中,如果沒有使用TEXT宏,則將字符串字面量并不會根據(jù)編譯器自動選擇編碼,而是采用默認編碼方式,導致字符串字面量在移植時可能出現(xiàn)亂碼問題,甚至將默認編碼格式的字符串字面量賦值給FString變量時,也會由于編碼方式不一致導致亂碼。
運行代碼,可以看到以下預期結果


# 02
FString和其他數(shù)據(jù)格式相互轉(zhuǎn)換
這里字符串和其他數(shù)據(jù)類型轉(zhuǎn)換,可以分為三類,分別是FString與FName、FText轉(zhuǎn)換,F(xiàn)String與通用C++字符串類型的轉(zhuǎn)換以及FString與非字符數(shù)據(jù)類型的轉(zhuǎn)換。
2-1 FString與FName、FText轉(zhuǎn)換
FString和FName相互轉(zhuǎn)換
FString和FText相互轉(zhuǎn)換
2-2?FString和C++相關字符串類型轉(zhuǎn)換
FString和TCHAR*,const TCHAR相互轉(zhuǎn)換
TCHAR*和FString轉(zhuǎn)換是比較簡單的,因為FString就是封裝的TCHAR數(shù)組,而TCHAR*類型也成為FString和char*類型轉(zhuǎn)換的過度;
const TCHAR*僅需把FString解引用即可得到;????
TCHAR* 可以通過FString成員函數(shù)GetCharArray().GetData()得到;????
const TCHARr*和TCHAR*可以直接賦值給FString
FString和char*,const char*相互轉(zhuǎn)換
FString和char*,const char*指針轉(zhuǎn)換通過宏定義來實現(xiàn)
FString和string相互轉(zhuǎn)換
C++中,string類型也是char*,因此FString和string轉(zhuǎn)換也是使用TCHAR_TO_UTF8和UTF8_TO_TCHAR宏實現(xiàn)。

FString和TArray<uint8*>
在UE4中,uint8類型就是usigned char
而uint8數(shù)組或者uint8*相當于FString字符串字面量的編碼結果;通過char*或者std::string可以將uint8*轉(zhuǎn)換為char*,再從char*轉(zhuǎn)FString。
循環(huán)打印出轉(zhuǎn)換后的TArray數(shù)組內(nèi)容,剛好是字符“1”“2”“3”“4”對應的ASCII碼49,50,52;而將TArray中的98,99,101轉(zhuǎn)換為字符串后,剛好是對應的字符bce。

FArrayReaderPtr、FBufferArchive和FString
FArrayReaderPtr、FBufferArchive也是UE4中特有的類,不過放在這里介紹,是因為它的轉(zhuǎn)換以uint8*為基礎進行的。將FArrayReaderPtr或者FBufferArchive轉(zhuǎn)FString,先將FArrayReaderPtr或者FBufferArchive中的內(nèi)容拷貝到uint8數(shù)組中,再通過上面介紹的方法從uint8數(shù)組轉(zhuǎn)FString;如下,F(xiàn)BufferArchive對象Writer存放的是\x1,16進制的1,也對應ASCII碼的編碼1,轉(zhuǎn)換為FString對象Writer2String后,也是\x1;

FString和ascii碼相互轉(zhuǎn)換

98對應的ascii碼是b,20013對應的ascii碼是漢字“中”。
2-3?FString和非字符數(shù)據(jù)類型轉(zhuǎn)換
其實從int、float等常用數(shù)據(jù)類型轉(zhuǎn)換到字符串,可以利用FString::Printf格式化即可。
FString和bool類型轉(zhuǎn)換

通過查看ToBool的底層實現(xiàn),分析FString是如何轉(zhuǎn)換為bool值的:
如果字符串是“True”、“Yes”,“On”將返回true;
如果字符串是“False”,“No”,“Off”將返回false;如果字符串是純數(shù)字的,轉(zhuǎn)換為int32類型,根據(jù)int32的值返回tru或者false;
其他的情況則都返回false;
FString和int32相互轉(zhuǎn)換
FString和int64相互轉(zhuǎn)換


# 03
小結
FStirng本質(zhì)上是TArray<TCHAR>數(shù)組
以TCHAR*為過渡,可以轉(zhuǎn)換為char*,uint8*等通用C++字符串類型
float,int32、int64等數(shù)據(jù)類型轉(zhuǎn)換為FString時,除了特有的函數(shù)外,都可以使用FString::Printf實現(xiàn)。

