【UE4学习】22_C++输出字符串及FString字符串转换

本文详细介绍了在Unreal Engine 4(UE4)中使用C++进行字符串操作,包括如何将FString输出到Output Log和屏幕,以及各种类型的字符串转换,如FString与FName、std::string之间的互换,还有与Integer、Float之间的转换。同时,还提到了FArrayReaderPtr、Array和FText等类型的转换,并给出了相关源代码头文件的引用作为参考。


C++输出字符串

输出字符串到output log中

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

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

输出字符串到屏幕上

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));

字符串转换

Converting FString to FNames

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

Converting std::string to FString

#include <string>

//....
std::string TestString = "Happy"; 
FString HappyString(TestString.c_str());

Converting FString to std::string

#include <string>

//....
FString UE4Str = "Flowers";
std::string MyStdString(TCHAR_TO_UTF8(*UE4Str));
  • 数值转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 );

Converting FString to Integer

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

Converting FString to Float

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

Converting Float/Integer to FString

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

UE4 Source Header References

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找到.

Converting FArrayReaderPtr to FString

uint8 data[512];  
FMemory::Memzero(data, 512);  

FMemory::Memcpy(data, ArrayReaderPtr->GetData(), ArrayReaderPtr->Num());  
FString str = ((const char*)data);  

Converting Array to 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);  

Converting FString to Array

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);  

Converting FString to 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)
{
}

Converting FString to const char *

const char *plainText= TCHAR_TO_ANSI(*aes_content);

Converting FString to TCHAR *

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

 int ARPG_Database::GetColumnIndex(int iResult, const TCHAR* columnName)
 {
 }

Converting FString to FText

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

Converting FText to FString

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

参考

<think>我们面对的问题是在Unreal Engine 5的C++环境中,将一个ASCII编码的字符串字节数组(即char数组或uint8数组)转换FString类型。 根据引用[2]我们知道,ASCII编码使用一个字节表示一个字符,且最高位为0,总共128个字符。因此,ASCII字符串本质上是一个char类型的数组(每个元素1字节),以空字符('\0')结尾。 在Unreal Engine中,FString是使用UTF-16编码的字符串(每个字符2字节或4字节,但通常使用2字节的TCHAR)。因此,我们需要将ASCII字符串转换为UTF-16编码。 在UE4/UE5中,通常使用TCHAR字符串(即FString的底层存储)来处理字符串。由于ASCII是单字节编码,而TCHAR在Windows上是wchar_t(2字节),在Linux和Mac上也是宽字符(4字节),因此我们需要进行转换。 但是,UE提供了一些转换函数。我们可以使用FString的构造函数,它有一个接受ANSI字符串(即ASCII扩展,但在我们这里纯ASCII也可以)的版本。注意,FString有一个构造函数可以接受ANSI字符指针(即char*),并指定编码转换。 然而,由于我们明确知道是ASCII(而不是其他多字节编码),我们可以使用以下方法: 方法1:使用FString的构造函数,该构造函数接受一个char*(ANSI字符串)和一个可选的编码参数(但通常我们使用默认的UTF8,注意ASCII是UTF8的子集,所以也可以直接转换)。 但是注意:FString的构造函数中,直接接受char*的构造函数已经被废弃(在UE5中)。因此,更安全的方式是使用字符串转换宏。 方法2:使用TCHAR转换宏,如TCHAR_TO_ANSI、ANSI_TO_TCHAR等。但注意,ANSI_TO_TCHAR可以将ANSI字符串(char*)转换为TCHAR字符串FString的底层)。 具体步骤: 1. 我们有一个ASCII字节数组(char数组),以空字符结尾(如果没有,我们需要自己添加或使用长度来构造)。 2. 使用FString的构造函数,或者使用转换函数。 实际上,FString提供了一个静态函数:FString::FromBlob,但它通常用于二进制数据,而不是字符串。 对于已知长度的ASCII字符串,我们可以这样: FString Result = FString(ANSI_TO_TCHAR(reinterpret_cast<const char*>(ByteArray))); 但是,注意:ANSI_TO_TCHAR这个宏在跨平台时需要注意,因为TCHAR在不同平台大小不同。在Windows上,它是宽字符,所以会进行多字节到宽字符的转换(使用当前系统的代码页,这可能导致问题)。因此,更推荐使用UTF8转换,因为ASCII是UTF8的子集。 方法3(推荐):因为我们的ASCII字符串实际上也是UTF8字符串(因为ASCII范围在UTF8中编码相同),所以我们可以使用UTF8_TO_TCHAR宏。 步骤: 将ASCII字节数组(假设为uint8_t数组或char数组)视为UTF8字符串(因为它是纯ASCII,所以不会出错),然后使用UTF8_TO_TCHAR转换成TCHAR字符串,再赋值给FString。 示例代码: 假设我们有一个数组:const uint8_t* AsciiByteArray = ...; 并且以'\0'结尾(或者知道长度)。 我们可以这样做: FString MyString = FString(UTF8_TO_TCHAR(reinterpret_cast<const char*>(AsciiByteArray))); 但是,如果我们的字节数组不是以空字符结尾,我们需要指定长度。那么我们可以使用FString的另一个构造函数: FString MyString = FString(UTF8_TO_TCHAR(reinterpret_cast<const char*>(AsciiByteArray)), Length); 注意:这个Length是字符数(对于ASCII,一个字节一个字符),但是注意:因为UTF8_TO_TCHAR宏实际上会调用转换函数,而转换函数需要遇到空终止符,所以如果我们指定长度,应该使用另一种方式。 实际上,FString有一个静态函数:FromUtf8,它可以直接从UTF8数据(包括ASCII)创建,并且可以指定长度。 因此,更准确的方式是: FString MyString = FString::FromUtf8(AsciiByteArray, Length); 这里,AsciiByteArray是uint8_t数组(或char数组),Length是数组的长度(字节数,也是字符数,因为每个ASCII字符一个字节)。 注意:FromUtf8函数会正确处理空终止符,但是如果我们的数组中间有空字符,它也会停止。所以如果我们知道长度,并且希望转换整个数组(包括中间可能有的空字符),我们需要使用另一种方式。 但是,通常字符串不会包含中间的空字符,所以如果我们有长度,我们可以这样做: FString MyString = FString::FromUtf8(AsciiByteArray, Length); 如果我们的字节数组以空字符结尾,我们也可以直接使用: FString MyString = UTF8_TO_TCHAR(reinterpret_cast<const char*>(AsciiByteArray)); 总结: 1. 如果ASCII字符串以空字符结尾,则推荐使用: FString MyString = UTF8_TO_TCHAR( (const char*) AsciiByteArray ); 注意:这实际上会调用FString的构造函数,接受TCHAR字符串(即宽字符串)。 2. 如果知道长度(或者可能包含空字符),则使用: FString MyString = FString::FromUtf8(AsciiByteArray, Length); 另外,注意:ASCII是UTF8的子集,所以使用UTF8转换是安全的。 参考引用[3],C++标准库中也有转换,但在UE中我们优先使用UE提供的函数。 根据引用[4]中,我们看到了UE_LOG打印FString的方法,我们可以用类似的方法测试转换结果。 示例代码: // 假设我们有一个ASCII字节数组 const uint8_t AsciiData[] = { 'H', 'e', 'l', 'l', 'o', 0 }; // 注意最后有0 // 方法1:使用UTF8_TO_TCHAR FString String1 = UTF8_TO_TCHAR(reinterpret_cast<const char*>(AsciiData)); UE_LOG(LogTemp, Log, TEXT("String1: %s"), *String1); // 方法2:使用FString::FromUtf8(显式指定长度,不包括末尾的0,因为数组中有0,但是我们也可以指定5) FString String2 = FString::FromUtf8(AsciiData, 5); // 注意,这里长度是5,所以不会转换最后的0 UE_LOG(LogTemp, Log, TEXT("String2: %s"), *String2); // 输出Hello(没有0,所以不会乱码,因为FString自己管理长度) 但是注意:方法2中,如果我们的字节数组没有空终止符,或者我们想转换整个数组(包括中间的0),我们必须使用FromUtf8并指定长度,因为用UTF8_TO_TCHAR宏要求以空字符结尾。 因此,根据情况选择。 相关问题: 1. 在UE5 C++中如何将FString转换为ASCII字节数组? 2. 如何处理非ASCII字符(如UTF8编码的多字节字符)的转换? 3. UE5中FString与std::string之间如何转换4. 在UE5中,转换字符串编码时需要注意哪些内存管理问题? 5. 如何使用UE5的TCHAR进行跨平台的字符串处理? 注意:以上方法适用于纯ASCII字符串,如果字节数组包含非ASCII字符(即扩展ASCII或UTF8编码的多字节字符),同样适用,因为FString::FromUtf8支持完整的UTF8编码。 </think>### UE5 C++ 中将 ASCII 字节数组转换FString 的方法 在 Unreal Engine 5 中,将 ASCII 编码的字节数组转换为 `FString` 需要正确处理字符编码转换。以下是详细步骤和方法: --- ### **1. 核心转换方法** #### **方法 1:使用 `FString::FromUtf8()`** ```cpp // ASCII 字节数组(以 uint8_t 或 char 存储) const uint8_t AsciiBytes[] = {72, 101, 108, 108, 111}; // "Hello" 的 ASCII 值 // 转换FString (指定长度) FString Result = FString::FromUtf8(AsciiBytes, sizeof(AsciiBytes)); // 验证输出 UE_LOG(LogTemp, Warning, TEXT("Result: %s"), *Result); // 输出:Hello ``` - **原理**: `FromUtf8()` 可将 UTF-8/ASCII 字节数组转为 `FString`。ASCII 是 UTF-8 的子集[^2],因此兼容转换- **关键参数**: - 字节数组指针:`const uint8_t*` 或 `const char*` - 数组长度:显式指定长度(避免依赖空终止符) #### **方法 2:使用 `UTF8_TO_TCHAR` 宏 + 构造函数** ```cpp const char* AsciiStr = "Unreal"; // ASCII 字符串 FString Result = FString(UTF8_TO_TCHAR(AsciiStr)); // 屏幕输出验证 GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, Result); ``` - **原理**: `UTF8_TO_TCHAR` 将 UTF-8/ASCII 转为 `TCHAR*`(`FString` 的底层格式)[^4]。 --- ### **2. 处理特殊场景** #### **情况 1:字节数组无终止符** ```cpp uint8_t RawBytes[5] = {87, 111, 114, 108, 100}; // "World" 无 '\0' FString Result = FString::FromUtf8(RawBytes, 5); // 显式指定长度 ``` #### **情况 2:混合 ASCII 和二进制数据** ```cpp TArray<uint8> Data; // 包含 ASCII + 二进制数据 // ... 填充 Data ... // 提取纯 ASCII 段(假设偏移量 10,长度 20) FString TextPart = FString::FromUtf8(Data.GetData() + 10, 20); ``` --- ### **3. 编码原理说明** 1. **ASCII 特性**: - 单字节编码(0-127),高位为 0[^2]。 - UE5 的 `FString` 内部使用 `TCHAR`(Windows 为 UTF-16,其他平台可能为 UTF-32)。 2. **转换本质**: ```mermaid graph LR A[ASCII 字节数组] -->|FromUtf8| B[FString UTF-16] A -->|UTF8_TO_TCHAR| C[TCHAR*] -->|FString 构造函数| B ``` --- ### **4. 验证与调试** ```cpp // 检查转换结果 if (Result.IsEmpty()) { UE_LOG(LogTemp, Error, TEXT("Convert failed!")); } // 输出原始字节(调试用) FString ByteStr; for (uint8_t Byte : AsciiBytes) { ByteStr += FString::Printf(TEXT("%d "), Byte); } UE_LOG(LogTemp, Log, TEXT("Bytes: %s"), *ByteStr); // 输出:72 101 108 108 111 ``` --- ### **注意事项** 1. **非 ASCII 字符**: 若字节包含值 >127(如扩展 ASCII),需确认是否为 UTF-8,否则可能乱码。 2. **内存安全**: 转换前确保字节数组有效(避免野指针)。 3. **性能**: `FString` 操作有开销,频繁转换时考虑复用对象[^1]。 --- ### 相关问题 1. 如何将 `FString` 反向转换为 ASCII 字节数组? 2. UE5 中如何处理非 UTF-8 编码(如 Latin-1)的字符串转换? 3. `TCHAR` 和 `FString` 在内存管理上有何差异? 4. UE5 跨平台开发时字符串编码需要注意哪些问题? 5. 如何优化 UE5 中大量字符串转换的性能? [^1]: FString 允许操作但开销较大 [^2]: ASCII 是单字节编码且高位为 0 [^4]: UE5 中字符串转换输出的常见方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值