基本数据类型


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> 基本数据类型、字符串处理及转换的更多相关文章

  1. 【UE4 C++ 基础知识】<11>资源的同步加载与异步加载

    同步加载 同步加载会造成进程阻塞. FObjectFinder / FClassFinder 在构造函数加载 ConstructorHelpers::FObjectFinder Constructor ...

  2. php面试笔记(2)-php基础知识-常量和数据类型

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 面试是每一个PHP初学者到PHP程序员必不可少的一步,冷 ...

  3. 【UE4 C++ 基础知识】<12> 多线程——FRunnable

    概述 UE4里,提供的多线程的方法: 继承 FRunnable 接口创建单个线程 创建 AsyncTask 调用线程池里面空闲的线程 通过 TaskGraph 系统来异步完成一些自定义任务 支持原生的 ...

  4. Python3基础知识之日期时间与字符的转换

    问题:“猿类”们都知道,编程中都会涉及到日期.时间类型与字符串类型的转换.不同场景,需要将字符串格式转换为日期类型:也需要将日期类型转换为字符串格式. 目标: 学习和积累python中time和dat ...

  5. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  6. java基础知识(二)字符串处理

    字符串是程序开发中使用最为频繁,因此为了工作的高效和作为一名想进阶的程序员,了解并掌握字符串的处理显得尤为重要.java为我们提供了String.StringBuffer.StringBuilde三个 ...

  7. swift 学习(一)基础知识 (基本数据类型,操作符,流控制,集合)

    xcode 中调用API帮助 1.查看简单信息,选中后 按键 control +左键单击  或者按 右侧属性栏 里的帮助按钮 2.完整API,选中后 按键 control +左键双击 3.查看类.函数 ...

  8. java基础知识—变量、数据类型和运算符

    1.变量:存储数据的一个基本单元.2.变量的声明和赋值: 1)声明并赋值;数据类型 变量名=值 例如:int prince=10; 2) 声明.赋值分为两步: 数据类型 变量名: 例如:int=pri ...

  9. Redis:基础知识及其常用数据类型和关键字

    Redis: Redis是什么: REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key-Value)分布式内存数 ...

随机推荐

  1. ELK学习之Logstash篇

    Logstash在ELK这一整套解决方案中作为数据采集终端,支持对接Kafka.数据库(MySQL.Oracle).文件等等. 而在Logstash内部的数据流转,主要经过三个环节:input -&g ...

  2. SQL-UPDATE触发器练习

    &练习一 如下所示三张表( student,grade,student_updata_before ): student表 grade表 Student_update_before表 # 触发 ...

  3. JS边角料: NodeJS+AutoJS+WebSocket+TamperMonkey实现局域网多端文字互传

    ---阅读时间约 7 分钟,复现时间约 15 分钟--- 由于之前一直在用的扩展 QPush 停止服务了,苦于一人凑齐了 Window, Android, Mac, ios 四种系统的设备,Apple ...

  4. Java-SpringBoot整合SpringCloud

    SpringBoot整合SpringCloud 1. SpringCloud特点 SpringCloud专注于为典型的用例和扩展机制提供良好的开箱即用体验,以涵盖其他情况: 分布式/版本化配置 服务注 ...

  5. servlet请求转发于重定向

    请求的转发与重定向是Servlet控制页面跳转的主要方法,在Web应用中使用非常广泛. 一. 请求的转发 Servlet接收到浏览器端请求后,进行一定的处理,先不进行响应,而是在服务器端内部" ...

  6. Spring Boot 2.x 之 H2 数据库

    1. Spring Boot下H2数据库的常用配置项 # 指定数据库的类型 spring.datasource.platform=h2 # 数据库连接地址(文件模式) ## AUTO_SERVER=T ...

  7. vue-router路由钩子

    路由跳转前后,需要做某些操作,这时就可以使用路由钩子来监听路由的变化. 接收三个参数: to: Route: 即将要进入的目标路由对象 from: Route: 当前导航正要离开的路由 next: F ...

  8. PHP的zip压缩工具扩展包学习

    总算到了 PHP 的拿手好戏上场了,前面我们学习过 Bzip2 . LZF . Phar 和 rar 这些压缩相关扩展在 PHP 中的使用,不过它们要么是太冷门,要么就是很多功能不支持.而 Zip 则 ...

  9. PHP的LZF压缩扩展工具

    这次为大家带来的是另外一个 PHP 的压缩扩展,当然也是非常冷门的一种压缩格式,所以使用的人会比较少,而且在 PHP 中提供的相关的函数也只是对字符串的编码与解码,并没有针对文件的操作.因此,就像 B ...

  10. Thinkphp5 主动式 计划任务 支持windows和linux

    百度搜索过相关的php计划任务的资料,特别是搜索thinkphp的计划任务,目前能明确实现的都是被动式的,就是通过tp3.2自带的计划任务类实现,通过挂钩子的形式,用户访问网站的时候就执行计划任务,这 ...