字符串 FString,TEXT,FName,FText,FCHAR 区别
FString
为动态字符串
FName
,FText为静态字符串
FName
是一种静态(不可变)字符串,主要被用来作为标识符等不变的字符串(例如:资源路径/资源文件类型/平台标识/数据表格原始数据等...)
FText
是一种静态字符串,在UE4中主要负责处理文本本地化,从而显示给不同语言的玩家。当你的游戏需要支持不止一种语言时,就需要考虑文本本地化,遵循这个规则:当字符串需要显示(面向玩家)时,应当使用 FText
因此当 FString 字符串需要显示(面向玩家)时,应当转换为 FText 类型再作显示。
FName
用来表示程序中的类,函数等名称使用,因为一般函数名等区分大小写,同时不会改变,这刚好也是FName
的特性。
FString
在程序中,需要对字符串进行相关操作,比如拼接等。消耗性能最大。类比c++
中的string
。
FText
封装了跨平台
,多语言
要使用的特性,只要是给人看的文字基本都要使用FText
来表示。
互相转化
- int转string
int Number = 10;
FString NumStr = FString::FromInt(Number);
- float转string
float FloatNum = 3.1415926;
FString NumStr = FString::SanitizeFloat(FloatNum);
// 只四舍五入保留小数点后6位3.141593
// 与蓝图一致
- bool转string
//引入头文件
#include "Kismet/KismetStringLibrary.h"
bool BoolVal = false;
FString Str = UKismetStringLibrary::Conv_BoolToString(BoolVal);
为什么要用TEXT()来包裹字符串
主要是因为平台一致性问题,对单个字符,有些平台会使用char
来表示,有些平台会使用wchar_r
来表示,使用TEXT()
可以让引擎对其统一操作
为什么FString::printf输出字符串时需要使用写字符串的地址才可以输出
原因是printf在原生c++原本也只支持char类型,如果需要输出字符串可以写字符串名的地址(和数组类似)
//这样我们可以用TCHAR*表示这种字符串
const TCHAR* TcharString = TEXT("Hello World!");
FString::Printf(TEXT("%s"),TcharString);
//也可以
const FString NormalString = TEXT("HiHi~");
FString::Printf(TEXT("%s"),*NormalString);//此处FString重载*,代表取TCHAR*的地址
重载*号如下:
/**
* Get pointer to the string
*
* @Return Pointer to Array of TCHAR if Num, otherwise the empty string
*/
FORCEINLINE const TCHAR* operator*() const
{
return Data.Num() ? Data.GetData() : TEXT("");
}
FString相关转换
数字相关
// int → FString:
FString NewString = FString::FromInt(MyInt);
// Float → FString:
FString VeryCleanString = FString::SanitizeFloat(MyFloat);
// → int
int MyShinyNewInt = FCString::Atoi(*MySting);
// → float:
float MyShinyNewFloat = FCString::Atof(*MyFloat);
FText,Char*
FString MyString = FString("abc");
// → TCHAR*:
TCHAR* MyChar = *MyString;
// → FName
FName MyName = FName(*MyString);
// → FText
FText MyText = FText::FromString(MyString);
// FName → FString
FString MyStringName = MyName.ToString();
// FText → FString
FString MyStringText = MyText.ToString();
数组与截取
// 字符串切割
TArray<FString> StringArray;
MyString.ParseIntoArray(StringArray, TEXT(","), false);
// 字符串截取
FString::Left(int count);
FString::Right(int count);
评论