【UE4 C++ 基础知识】<3> 基本数据类型、字符串处理及转换
基本数据类型
TCHAR
TCHAR就是UE4通过对char和wchar_t的封装
char
ANSI编码wchar_t
宽字符的Unicode编码
使用
TEXT()
宏包裹作为字面值TCHAR* TCharString = TEXT("Hello, World!"); // 引擎字符串(TCHAR*) -> ANSI字符串(char*)
char* CharString = TCHAR_TO_ANSI(TCharString); // 引擎字符串(TCHAR*) -> std::string
std::string str = TCHAR_TO_UTF8(TCharString); // 引擎字符串(TCHAR*) -> wchar_t*
wchar_t* WCharString = TCHAR_TO_WCHAR(TCharString); // ANSI字符串(char*) -> 引擎字符串(TCHAR*)
TCHAR* TCharString1 = ANSI_TO_TCHAR(CharString); // wchar_t* -> 引擎字符串(TCHAR*)
TCHAR* TCharString2 = UTF8_TO_TCHAR(WCharString);
TCHAR* TCharString3 = WCHAR_TO_TCHAR(WCharString);
FNames
常用作标识符等不变的字符串(如:资源路径/资源文件类型/骨骼名称/表格行名等)
- 比较字符串操作非常快
- 即使多个相同的字符串,也只在内存存储一份副本,避免了冗余的内存分配操作
- 不区分大小写
使用
初始化
FName TestHUDName = FName(TEXT("ThisIsMyTestFName"));
比较
CompareFloat = TestFName.Compare(OtherFName);
搜索
if( FName(TEXT("pelvis"), FNAME_Find) != NAME_None ){}
FString <-> FName
TestHUDName = FName(*TestHUDString);
TestHUDString = TestHUDName.ToString();
FText
FText 是一种静态字符串,在UE4中可以负责处理文本本地化、UI 文本显示等
- 支持文本本地化
- 提高文本渲染的性能
- 较快的copy操作
使用
FString <-> FText
TestHUDText = FText::FromString(TestHUDString);
TestHUDString = TestHUDText.ToString();
FName -> FText
TestHUDText = FText::FromName(TestHUDName);
比较
FString
初始化
FString str1("Hello!");
FString str2 = TEXT("Hello World!");
FString str3 = FString::Printf(TEXT("I am %d years old"), 18);
比较
if(MyFString.Equals(OtherFString, ESearchCase::CaseSensitive)){...} // 大小写敏感
if(MyFString.Equals(OtherFString, ESearchCase::IgnoreCase)){...}
if(MyFString == OtherFString){...}
拼接
FString str4 = TEXT("Hello World!");
str4 += FString("UE4");
float value = 1.0f;
FString str5 = FString::Printf(TEXT("Current Value: %f"),value);
分割
FString str6 = TEXT("Blueprint, C++, Material");
TArray<FString> strList;
str6.ParseIntoArray(strList, TEXT(","), true);
FString 与其他类型字符串转换
FString <-> int32/float
// FString -> int32/float
FString TheString = "233";
int32 MyShinyNewInt = FCString::Atoi(*TheString); FString TheString = "233.3";
float MyStringtoFloat = FCString::Atof(*TheString); // int32/float -> FString
FString NewString = FString::FromInt(233);
FString NewString = FString::SanitizeFloat(233.3f);
FString <-> TCHAR* 自动隐式转换
const FString MyFString;
const TCHAR *TCharString = *MyFString; const FString MyFString=TCharString;
FString → char *
// 1
char *plainText= TCHAR_TO_ANSI(*str); // 2
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());FString <-> std::string
// FString -> std::string
FString UE4Str = "Flowers";
std::string MyStdString(TCHAR_TO_UTF8(*UE4Str)); // std::string -> FString
std::string TestString = "Happy";
FString HappyString(TestString.c_str());
FString <-> TArray
// FString -> TArray<uint8>
FString JsonStr;
TArray<uint8> content;
content.SetNum(JsonStr.Len());
memcpy(content.GetData(), TCHAR_TO_ANSI(*JsonStr), JsonStr.Len()); //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);
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 );
std::string <-> std::wstring
- WideCharToMultiByte
// std::wstring -> std::string
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;
} // std::string -> std::wstring
std::string str_path=TCHAR_TO_UTF8(*AppPath);
std::wstring wstr_path;
wstr_path.assign(str_path.begin(), str_path.end());
其他
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找到.
参考
【UE4 C++ 基础知识】<3> 基本数据类型、字符串处理及转换的更多相关文章
- 【UE4 C++ 基础知识】<11>资源的同步加载与异步加载
同步加载 同步加载会造成进程阻塞. FObjectFinder / FClassFinder 在构造函数加载 ConstructorHelpers::FObjectFinder Constructor ...
- php面试笔记(2)-php基础知识-常量和数据类型
本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 面试是每一个PHP初学者到PHP程序员必不可少的一步,冷 ...
- 【UE4 C++ 基础知识】<12> 多线程——FRunnable
概述 UE4里,提供的多线程的方法: 继承 FRunnable 接口创建单个线程 创建 AsyncTask 调用线程池里面空闲的线程 通过 TaskGraph 系统来异步完成一些自定义任务 支持原生的 ...
- Python3基础知识之日期时间与字符的转换
问题:“猿类”们都知道,编程中都会涉及到日期.时间类型与字符串类型的转换.不同场景,需要将字符串格式转换为日期类型:也需要将日期类型转换为字符串格式. 目标: 学习和积累python中time和dat ...
- Java学习之旅基础知识篇:数据类型及流程控制
经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...
- java基础知识(二)字符串处理
字符串是程序开发中使用最为频繁,因此为了工作的高效和作为一名想进阶的程序员,了解并掌握字符串的处理显得尤为重要.java为我们提供了String.StringBuffer.StringBuilde三个 ...
- swift 学习(一)基础知识 (基本数据类型,操作符,流控制,集合)
xcode 中调用API帮助 1.查看简单信息,选中后 按键 control +左键单击 或者按 右侧属性栏 里的帮助按钮 2.完整API,选中后 按键 control +左键双击 3.查看类.函数 ...
- java基础知识—变量、数据类型和运算符
1.变量:存储数据的一个基本单元.2.变量的声明和赋值: 1)声明并赋值;数据类型 变量名=值 例如:int prince=10; 2) 声明.赋值分为两步: 数据类型 变量名: 例如:int=pri ...
- Redis:基础知识及其常用数据类型和关键字
Redis: Redis是什么: REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key-Value)分布式内存数 ...
随机推荐
- thinkphp5.x在函数禁用的情况下绕过
描述 测试的时候发现一个thinkphp的网站,有tp5的漏洞但无法执行命令,但没机会进行后续测试,所有在这里自己搭建环境进行复现一下. 使用的是tp5.0.16 一开始使用网上的payload打一直 ...
- 机械硬盘换到SSD后系统引导报错代码0xc000000e
由于机械硬盘IO不够用,系统使用起来非常的缓慢,特意购买了新的SSD进行了替换.机械硬盘的IO在70左右,SSD的IO在1000-4000左右指普通消费SSD. 由于不想安装系统,就直接把机械硬盘的数 ...
- [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型
[源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型 目录 [源码解析] 深度学习流水线并行 PipeDream(3)--- 转换模型 0x00 摘要 0x01 前言 1.1 改 ...
- Django——session保持登录
Django操作session语法: # 1.设置Sessions值 request.session['session_name'] ="admin" # 2.获取Sessions ...
- Apache配置与应用
目录: 一.基于域名的虚拟主机 二.基于IP地址的虚拟主机 三.基于端口的虚拟主机 四.Apache连接保持 五.构建Web虚拟目录与用户授权限制 六.Apache日志分割 七.AWStats 分析系 ...
- Linux目录同步到阿里云OSS工具ossutil
Linux目录同步到阿里云OSS工具ossutil 背景 最近公司服务用户激增,常规文件服务器不能满足需求,严重影响性能,决定将静态文件迁移到阿里云OSS,用来解决性能问题,提高用户体验.毕竟之前 ...
- 网站URL如何SEO优化
前言 本文讲解网站的URL如何进行SEO优化,并在自己的WordPress博客echeverra中优化URL. 起因 对于SEO我了解的并不多,只知道SEO做的好,那么各大搜索网站搜索你网站相关内容时 ...
- PyTorch学习笔记6--案例2:PyTorch神经网络(MNIST CNN)
上一节中,我们使用autograd的包来定义模型并求导.本节中,我们将使用torch.nn包来构建神经网络. 一个nn.Module包含各个层和一个forward(input)方法,该方法返回outp ...
- 2021ICPC网络赛第一场部分题解-The 2021 ICPC Asia Regionals Online Contest (I)
写在前面 本来应该6题的,结果不知道哪个铸币发了H的clar,当即把我们的思路转向三维几何上.当时我们还在想这三维计算几何的正确率有点太高了还在感叹ICPC选手的含金量,直到赛后我才知道这H题的铸币出 ...
- 迷你商城后台管理系统---------stage3项目部署测试汇总
系统测试 在项目部署到云服务器之前,已通过本机启动springboot程序,访问localhost:8080,输入登陆的账户等一系列操作测试:功能测试.健壮性测试,系统已满足用户规定的需求. 系统部署 ...