【UE4 C++】FString 类型转换操作

时间:2021-04-22
本文章向大家介绍【UE4 C++】FString 类型转换操作,主要包括【UE4 C++】FString 类型转换操作使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

FString字符串转换

FString 转其他类型

  • FString → FNames
FString TheString = "UE4_C++_IS_Awesome";
FName ConvertedFString = FName(*TheString);
  • FString → Integer
FString TheString = "123.021";
int32 MyShinyNewInt = FCString::Atoi(*TheString);
  • FString → Float
FString TheString = "123.021";
int32 MyShinyNewInt = FCString::Atof(*TheString);
  • 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 → std::string
#include <string>

//....
FString UE4Str = "Flowers";
std::string MyStdString(TCHAR_TO_UTF8(*UE4Str));
  • 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)
 {
 }
  • FString → FText
FString Str = TEXT("str");  
FText Text = FText::FromString(Str);
  • FString → TArray
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);  

其他类型转 FString

  • Float/Integer → FString
FString NewString = FString::FromInt(YourInt);
FString VeryCleanString = FString::SanitizeFloat(YourFloat);
  • FText → FString
FString Name = NameDesc->GetText().ToString();
  • std::string → FString
#include <string>

//....
std::string TestString = "Happy"; 
FString HappyString(TestString.c_str());
  • TArray → 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); 
  • FArrayReaderPtr → FString
uint8 data[512];  
FMemory::Memzero(data, 512);  

FMemory::Memcpy(data, ArrayReaderPtr->GetData(), ArrayReaderPtr->Num());  
FString str = ((const char*)data);  
  • 数值 → std::to_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导致的乱码

/乱码
FString GetStrWithChinese()
{
    FString fstr="这是一句中文";
    return fstr;
}

//正确使用
FString GetStrWithChinese()
{
    FString fstr=TEXT("这是一句中文");
    return fstr;
}

std::string转FString导致乱码

  • 因为std::string可以理解为char数组,char占1个字节,而中文字符根据不同平台,一般占用2个字符,超出了存储范围,因此导致乱码.
  • 可以使用std::wstring(宽字符)来存储中文,std::wstring.cstr()会返回一个const wchar_t*类型,UE4中常用的TCHAR实际上就是wchar_t的别名.
  • 可以认为 std::wstring.cstr()const wchar_t*const TCHAR*
//乱码
std::string cstr = "中文技术哪家强";
 	FString fstr=FString(cstr.cstr());

//正确使用
//宽字符初始化要L开头
std::wstring cwstr = L"中文技术哪家强?";

//还可以使用wchar_t*来表示一个包含中文的字符串
wchar_t* wchar = L"中文技术哪家强?";

//wchar_t*和std::wstirng的转换
const wchar_t* tmpwchar = cwstr.c_str();

//上面说了TCHAR本质就是wchar_t
TCHAR* tchar = wchar;

//std::wstring.cstr()返回的是const wchar_t*,所以这里使用const_cast将其由const wchar_t*转换成wchar_t*,也就是TCHAR*
TCHAR* tchar = const_cast<wchar_t*>(cwstr.c_str());

//ue4中,可以直接使用TCHAR*或者const TCHAR*来初始化FString
FString fstr=tchar;

//如果其他平台传来的是带有中文的std::string字符串
std::string cstr="中文技术哪家强?";

//windows平台std::string使用utf-8编码格式,可以使用ue提供的UTF8_TO_TCHAR宏将std::string转换成ue支持的TCHAR
FString fstr=FString(UTF8_TO_TCHAR(cstr.cstr());

FString转std::string导乱码

std::string中存储的数据并没有被损坏,不能正常的显示中文而已。可以把它转换成std::wstirng看看是否正常

//乱码
//定义一个包含中文的FString
FString fstr = TEXT("这是一句中文" );
//使用TCHAR_TO_UTF8将FString转换成std::string
std::string cstr = TCHAR_TO_UTF8(*fstr);

//转换
//MultiByteToWideChar和WideCharToMultiByte需要导入Windows.h
std::wstring StringToWString(const std::string& str)
{
	//定义一个空的std::wstring
	std::wstring wstr = L"";

	/**
	 * CodePage:该参数决定执行转换时使用的编码格式,本机使用编码格式为UTF8,所以使用CP_UTF8.
	 *dwFlags:使用0即可
	 *lpMultiByteStr:要转换的字符串指针,使用c_str()即可获得
	 *cbMultiByte:要转换的字符串的长度,字节为单位,可以使用size()获得
	 *lpWideCharStr:指向接收转换后字符串的缓冲区的指针
	 *cchWideChar:缓冲区大小,如果为0,则返回所需要的缓冲区大小
	*详见https://docs.microsoft.com/zh-cn/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar?redirectedfrom=MSDN
	 */

	//lpWideCharStr设为NULL,cchWideChar设为0,该步骤用于获取缓冲区大小
	int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.size(), NULL, 0);

	//创建wchar_t数组作为缓冲区,用于接收转换出来的内容,数组长度为len+1的原因是字符串需要以'\0'结尾,所以+1用来存储'\0'
	wchar_t* wchar = new wchar_t[len + 1];

	//缓冲区和所需缓冲区大小都已确定,执行转换
	MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.size(), wchar, len);

	//使用'\0'结尾
	wchar[len] = '\0';

	//缓冲区拼接到std::wstring
	wstr.append(wchar);

	//切记要清空缓冲区,否则内存泄漏
	delete[]wchar;
	return wstr;
}

std::wstring转std::string

std::wstring转std::string代码,需要使用WideCharToMultiByte

std::string WStringToString(const std::wstring wstr)
{
	std::string str;

	int len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr.size(), NULL, 0, NULL,NULL);

	char*buffer = new char[len + 1];

	WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), wstr.size(), buffer, len, NULL, NULL);

	buffer[len] = '\0';

	str.append(buffer);

	delete[]buffer;

	return str;
}

其他

UE4 Source Header References

CString.h
UnrealString.h
NameTypes.h
StringConv.h (TCHAR_TO_ANSI etc)

CString.h可以查到更多,如

toi64 (string to int64)
Atod    (string to double precision float)

更多关于FString的操作可以到UnrealString.h找到.


原文地址:https://www.cnblogs.com/shiroe/p/14691181.html