【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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 自己封装数据库工具类
- Git---->Linux常用命令+主干、分支合并,发生冲突+当紧急任务来时,文件暂存+忽略文件不提交
- 使用servlet完成简单的登录功能(servlet与html之间跳转(重定向))
- gitee配置
- idea--->先交给git本地仓库--->再push到远程仓库
- 图书系统优化分页与搜索跳转
- 解决ie浏览器回车不刷新验证码问题
- jsp跳转jsp----------和------------jsp跳转servlet跳转jsp
- idea中下载并配置稳定版本的MAVEN,电脑环境配置 + setting.xml文件配置
- Python代码性能分析之cProfile
- 自己写一个简单的MyBatis工具类代码+注释
- 多对一和一对多
- 使用C3P0连接数据库
- QQ授权,接收代码发送的电子邮件
- c:set