【转载】UE4 中的字符串转换

3,321 阅读2分钟

原文链接

打印字符串

输出字符串到控制台

FString filePath
UE_LOG(LogTemp, Log, TEXT("%s"), *filePath);

UE_LOG(LogTemp, Error, TEXT("Hello,World!"));

输出字符串到屏幕上

#include "Engine.h"
 
FString filePath;
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("DLL_Init")));
 
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("%s"), *filePath));

字符串 <-> 数字

数值 -> std::string

std::string to_string( long value );
std::string to_string( long long value );
std::string to_string( unsigned value );
std::string to_string( unsigned long value );
std::string to_string( unsigned long long value );
std::string to_string( float value );
std::string to_string( double value );
std::string to_string( long double value );

FString -> Integer

FString TheString = "123.021";
int32 MyShinyNewInt = FCString::Atoi(*TheString);

FString -> Float

FString TheString = "123.021";
int32 MyShinyNewInt = FCString::Atof(*TheString);

Float/Integer -> FString

FString NewString = FString::FromInt(YourInt);
FString VeryCleanString = FString::SanitizeFloat(YourFloat);

UE4 相关头文件

CString.h
UnrealString.h
NameTypes.h
StringConv.h (TCHAR_TO_ANSI etc)
  • CString.h 可以查到更多,如
atoi64 (string to int64)
Atod(string to double precision float)
  • 更多关于 FString 的操作可以到 UnrealString.h 找到.

字符串转换(FNames / FText / std::string / char*)

FString -> FNames

FString TheString = "UE4_C++_IS_Awesome";
FName ConvertedFString = FName(*TheString);

FString -> FText

FString Str = TEXT("str");  
FText Text = FText::FromString(Str);

FText -> FString

FString Name = NameDesc->GetText().ToString();  

std::string -> FString

#include <string>
 
//....
std::string TestString = "Happy"; 
FString HappyString(TestString.c_str());

FString -> std::string

#include <string>
 
//....
FString UE4Str = "Flowers";
std::string MyStdString(TCHAR_TO_UTF8(*UE4Str));

FString -> char *

///1
FString str
string t = TCHAR_TO_UTF8(*str);
char * returnvalue = (char *)malloc(sizeof(char) * (t.length() + 1));
strncpy_s(returnvalue, t.length() , t.c_str(), t.length());  
 
///2
int ARPG_Database::BP_GetColumnIndex(int resultSet, FString columnName)
{
    return GetColumnIndex(resultSet, TCHAR_TO_ANSI(*columnName));
}
 
int ARPG_Database::GetColumnIndex(int iResult, const char* columnName)
{
}

FString -> const char *

const char *plainText= TCHAR_TO_ANSI(*aes_content);

FString -> TCHAR *

 int ARPG_Database::BP_GetColumnIndex(int resultSet, FString columnName)
 {
     return GetColumnIndex(resultSet, *columnName);
 }
 
 int ARPG_Database::GetColumnIndex(int iResult, const TCHAR* columnName)
 {
 }

三种字符串类型分别的使用场景

FName 通常是某个东西的 ID。 它们不区分大小写,这可能是记住它们最重要的一点。  

  • 资产名称  
  • 材质参数  
  • 带标签的演员  
  • 骨骼的名字  

FText 通常是你想让用户看到的任何内容,即使你不打算进行本地化。  

  • 你在 HUD 上显示的任何文本  
  • 当你的玩家输入他们的名字获得高分时  
  • 日历日期和时间  

FString 允许您操作变量值,比如反转字符串或获取子字符串。  

  • 建立一个网址 URL  
  • 新建一个欲保存的文件名

字符(uint8)数组

FArrayReaderPtr -> FString

uint8 data[512];  
FMemory::Memzero(data, 512);  
 
FMemory::Memcpy(data, ArrayReaderPtr->GetData(), ArrayReaderPtr->Num());  
FString str = ((const char*)data);  

TArray<uint8> -> FString

TArray<uint8> content;  
...  
const std::string cstr(reinterpret_cast<const char*>(content.GetData()), content.Num());  
FString frameAsFString = cstr.c_str();  
UE_LOG(VRSLog, Warning, TEXT("%s"), *frameAsFString);  

FString -> TArray<uint8>

FString JsonStr;  
TArray<uint8> content;  
 
content.SetNum(JsonStr.Len());  
memcpy(content.GetData(), TCHAR_TO_ANSI(*JsonStr), JsonStr.Len());   
FString StrData;  
const TCHAR* StrPtr = *StrData;  
FTCHARToUTF8 UTF8String(StrPtr);  
int32 CTXSize = UTF8String.Length();  
 
TArray<uint8> URLData;  
URLData.SetNum(CTXSize);  
memcpy(URLData.GetData(), UTF8String.Get(), CTXSize);