UE4_最全FString字符串与各格式转换输出-知乎
https://zhuanlan.zhihu.com/p/448713737
UE4 常用类型数据转换
1.FString参考
//FString官方文档:https://docs.unrealengine.com/4.26/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/StringHandling/FString/
//构建 FString
FString TestHUDString = FString(TEXT("This is my test FString."));
//输出 FString
UE_LOG(LogTemp, Log, TEXT("%s"), *TestHUDString );
FString转换
从 FString->FName,FString->FName->FText
从 | 到 | 范例 |
---|---|---|
FString | FName |
FString -> FName 不可靠。因为 FName 不区分大小写,所以转换存在损耗。 |
FString | FText |
FString -> FText 在一些情况下有效,但需注意 — FString 内容不会从 FText 的"自动本地化"中受益。 |
从FName->FString,FTex->FString
从 | 到 | 范例 |
---|---|---|
FName | FString |
|
FText | FString |
FText -> FString 不可靠。它在一些语言的转换中存在潜在损耗。 |
数字和其他变量到 FString
变量类型 | 从字符串转换 | 字符串格式 |
---|---|---|
float |
| |
int |
| |
bool |
| either 'true' or 'false' |
FVector |
| 'X= Y= Z=' |
FVector2D |
| 'X= Y=' |
FRotator |
| 'P= Y= R=' |
FLinearColor |
| '(R=,G=,B=,A=)' |
UObject |
| UObject's FName |
对于其他数值转换,可使用带合适参数的 FString::Printf() 函数。
// FString::Printf 格式话字符串
//输出 FString
UE_LOG(LogTemp, Log, TEXT("%s"), FString::Printf(TEXT("-- TestFuncThreeParams,%d, %d,%f"), bVal ? 1:0, iVal, fVal) );
从 FString 到 int 和浮点型数字变量,以及到布尔型变量之间也存在转换。
变量类型 | 从字符串转换 | 注解 |
---|---|---|
bool |
| |
int |
| |
float |
|
代码参考如下
{
//FString to FName
FString Str = TEXT("TestString");
FName Name = FName(*Str);
//FName To FString
FString TargetFString = Name.ToString();
}
{
//std::string to FString
std::string stdStr = "TestString";
FString MyStr(stdStr.c_str());
//FString To char*
char* c = TCHAR_TO_UTF8(*MyStr);
//FString to std::string
std::string TargetString(TCHAR_TO_UTF8(*MyStr));
//FString <-> TCHAR* 自动隐式转换
const FString MyFString;
const TCHAR *TCharString = *MyFString;
const FString MyFString=TCharString;
}
{
//FString to Int32
FString str = TEXT("TestString");
int32 i_1 = FCString::Atoi(*str);
//or
int32 i_2 = atoi(TCHAR_TO_UTF8(*str));
//FString to float
int32 f_1 = FCString::Atof(*str);
//or
int32 f_2 = atof(TCHAR_TO_UTF8(*str));
//FString to bool
bool bNewBool = str.ToBool();
//Int32 to FString
FString TStr = FString::FromInt(123);
//float to FString
FString TStr_2 = FString::SanitizeFloat(123.3f);
//bool to FString
int32 b = true;
FString Out= b ? TEXT("true"): TEXT("false");
}
{
//FString to TCHAR*
FString Str1(TEXT("TestString"));
const TCHAR* MyTChar = *Str1;
//FString to FText
FText MyText = FText::FromString(Str1);
//FText to FName
FName Name2 = FName(*MyText.ToString());
//FName to FText
FText MyText_1 = FText::FromName(Name2);
}
{
//FString To TArray<uint8>
FString Str = "Hello UE4"; // 原数据
TArray<uint8> outDataArray; // 目标数据
TCHAR* CharData = Str.GetCharArray().GetData();
int32 Len = FCString::Strlen(CharData);
for (int i = 0; i < Len; i++)
{
uint8* dst = (uint8*)TCHAR_TO_UTF8(CharData);
outDataArray.Add(*dst);
CharData++;
}
// or UE4方法
FBase64::Decode(Str, outDataArray);
//TArray<uint8> To FString
const std::string cstr(reinterpret_cast<const char*>(outDataArray.GetData()), outDataArray.Num());
FString MyStr1(cstr.c_str());
// or UE4方法
FString DestStr = FBase64::Encode(outDataArray);
}
{
// 枚举
enum ETempEnum { One, Two, Three };
{
// 枚举转换字符串
// 通过枚举类型的名字找到对应枚举类型的元数据指针(或者叫COD:class Object Defalut)
const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE,TEXT("ETempEnum"), true);
if (EnumPtr)
{
FString str = EnumPtr->GetNameStringByIndex(ETempEnum::Two);
}
}
{
// 字符串转换为枚举
const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE,TEXT("ETempEnum"), true);
if (EnumPtr)
{
ETempEnum OutEnum = (ETempEnum)EnumPtr->GetIndexByNameString(TEXT("One"));
}
}
}
{
//FString To Md5
FString String("sdsafasfasf");
FMD5::HashAnsiString(*String);
// FString To Sha1
FSHA1 Sha1Gen;
Sha1Gen.Update((unsigned char*)TCHAR_TO_ANSI(*String), FCString::Strlen(*String));
Sha1Gen.Final();
FString Sha1String;
for (int32 i = 0; i < 20; i++)
{
Sha1String += FString::Printf(TEXT("%02x"), Sha1Gen.m_digest[i]);
}
}
资料以及参考:
【UE4 C++ 基础知识】<3> 基本数据类型、字符串处理及转换 - 某校不良生 - 博客园
------------------------------------------------------------------------------------------------------------------------------