【UE4从零开始 008】字符串简介

UE4中提供了多个不同类,以便于根据需要处理字符串。

1、FName

FName通过一个轻型系统使用字符串。在此系统中,字符串会存储在数据表中,以便能被重复使用。FName不区分大小写且不可变。FName的存储系统和静态特性决定了通过Key进行FName的查找和访问的速度较快。FName子系统的另一个功能是使用HASH表为FName转换提供快速字符串。

FName不区分大小写,作为索引组合存储在唯一字符串和实例编号的数据表中。

创建
	FName TestFName = FName(TEXT("TestFName"));
对比
  • == 运算符,返回true或false。它并不执行字符串的对比,而是对比索引中的数值,极大地节约了CPU的开销。
  • FName::Compare函数,返回的是int32值。若小于OtherFName则返回的值小于0;等于OtherFName则返回0;大于OtherFName则返回的值大于0。
	bool bSame = TestFName == OtherFName;
	int32 compareValue = TestFName.Compare(OtherFName);
搜索表

如需确定FName是否在表中,可以使用下面这种方式。如果不存在的话,FName的索引将被设为 NAME_None,且不会将字符串添加到表中。

	if (FName(TEXT("TestFName"), FNAME_Find) != NAME_None)
	{

		UE_LOG(LogClass, Log, TEXT("TestFName is exist!"));
	}
	else
	{
		UE_LOG(LogClass, Log, TEXT("TestFName is not exist!"));
	}

2、FText

FText代表一个显示字符串,为用户显示的文本都需要由FText处理。FText类拥有本地化的内置支持,可处理已经本地化并存储在查找表中的文本内容,以及在运行时被本地化的文本,如:数字、日期、时间和格式化文本。同时可以用FText处理无需进行本地化的文本,包括用户输入内容,如玩家名字和Slate显示的文本。

创建

因为FText的本地化应用,没个FText必须以 KeyValue 进行设置。使用NSLOCTEXT和LOCTEXT宏可对FText进行设置。LOCTEXT将 KeyValue作为参数,所有参数必须为字符串文字。所有的文字将通过本地化系统进行传递。

/* Top of File */ 
#define LOCTEXT_NAMESPACE "TestFTextNamespace"
...
	FText TestFText = LOCTEXT("FText_Key", "FText_Value");
...
#undef LOCTEXT_NAMESPACE
/* Bottom of File */ 

必须先将全局LOCTEXT_NAMESPACE宏设置为字符串文字,以指定本地化键的命名空间。

还可以使用 NSLOCTEXT 将命名空间作为参数来创建本地化字符串。

FText TestFText = NSLOCTEXT("TestFTextNamespace", "FText_Key", "FText_Value");

创建空白的FText可以使用以下两种方式:

	FText EmptyFText0 = FText::GetEmpty();
	FText EmptyFText1 = FText();
数字转FText
  • FText::AsNumber()
  • FText::AsPercent()
  • FText::AsCurrency()
  • FText::AsDate()
  • FText::AsTime()
对比
  • FText::EqualTo()FText::EqualToCaseIgnored(),返回true或false。
  • FText::CompareTo()FText::CompareToCaseIgnored(),返回int32值。

因为FText比较复杂,所以不支持重载运算符比较。

3、FString

与FName和FText不同,FString是唯一允许操作的字符串类。如:大小写转换、截取字符串、逆向等。由于FString是可变的,所以对其进行查找、对比等时开销比不可变字符串类更大。

创建
FString TestFString = FString(TEXT("Test FString"));
对比
  • ==, 返回true或false,忽略大小写。
  • FString::Equals(),返回true或false,可以传参ESearchCase的枚举来确定是否忽略大小写。

TestFString == OtherFString 等同于 TestFString.Equals(OtherFString, ESearchCase::IgnoreCase)
TestFString.Equals(OtherFString) 等同于 TestFString.Equals(OtherFString, ESearchCase::CaseSensitive)

搜索
  • FString::Contains(),返回true或false,可以传参ESearchCase(是否忽略大小写)和ESearchDir(搜索方向),默认参数为忽略大小写,从前往后搜索。
  • 第二种是 FString::Find(),返回找到的第一个子字符串实例的索引,若未找到则返回-1。可以传参ESearchCase(是否忽略大小写)、ESearchDir(搜索方向)和开始搜索的位置,默认参数为忽略大小写,从前往后搜索,从第一个字符开始。
构建

可通过两种方法用 字符串其他类型变量来构建FString。

  • ++= 运算符串联FString。如:FString TestFString += OtherFString
  • FString::Printf,FString TestFString = FString::Printf(TEXT("%02d:%02d"), NumMinutes, NumSeconds)

使用 %s 参数包含 FStrings 时,必须使用 * 运算符返回 %s 参数所需的 TCHAR*。
如:FString::Printf(TEXT(“Test FString:%s”), *OtherFString)

类型互转

FString、FName、FText之间互转
范例
FNameFStringTestFString = TestFName.ToString()
FNameFTextTestFText = FText::FromName(TestFName) PS:FName -> FText 在一些情况下有效,但需注意 FName 内容不会从 FText 的“自动本地化”中受益
FStringFNameTestFName = FName(*TestFString) PS:FString -> FName 不可靠。因为 FName 不区分大小写,所以转换存在损耗。
FStringFTextTestFText = FText::FromString(*TestFString) PS:FString -> FText 在一些情况下有效,但需注意 — FString 内容不会从 FText 的“自动本地化”中受益。
FTextFStringTestFString = TestFText.ToString() PS:FText -> FString 不可靠。它在一些语言的转换中存在潜在损耗。
FTextFNameFText 到 FName 的转换不存在。但可先转换到 FString,再转换到 FName。 PS:FText -> FString -> FName 不可靠。因为 FName 不区分大小写,所以转换存在损耗。
FString与其他类型互转
范例字符串格式化
floatFStringFString::SanitizeFloat(FloatVariable);
intFStringFString::FromInt(FloatVariable);
boolFStringInBool ?TEXT(“true”) :TEXT(“false”);‘true’ or ‘false’
FVectorFStringVectorVariable.ToString();‘X= Y= Z=’
FVector2DFStringVector2DVariable.ToString();‘X= Y=’
FRotatorFStringRotatorVariable.ToString();‘P= Y= R=’
FLinearColorFStringLinearColorVariable.ToString();‘(R=,G=,B=,A=)’
UObjectFString(InObj != NULL) ? InObj->GetName() : FString(TEXT(“None”));UObject’s FName
FStringintFCString::Atoi(*TestFString);
FStringfloatFCString::Atof(*TestFString);
FStringboolTestFString.ToBool();“True”、“Yes”、“GTrue”、“GYes”、非0数字,转为true;“False”、“No”、“GFalse”、“GNo”、“0”、不可解析的字符串,转为false。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值