Jelajahi Sumber

Add FString

usuiforhe 4 tahun lalu
induk
melakukan
6ffaf52c5f
1 mengubah file dengan 80 tambahan dan 1 penghapusan
  1. 80 1
      虚幻.md

+ 80 - 1
虚幻.md

@@ -1782,4 +1782,83 @@ Actor的创建分为三种方式,三种方式创建的Actor生命流程有细
 5. BeginPlay(标志Actor被创建到事件中)
 6. Tick
 
-> 组件是在BeginPlay方法之前构建的
+> 组件是在BeginPlay方法之前构建的
+
+<!--
+ * @Version: 
+ * @Autor: LC
+ * @Date: 2021-12-09 10:25:59
+ * @LastEditors: LC
+ * @LastEditTime: 2021-12-09 18:43:02
+ * @Description: file content
+-->
+### 虚幻字符串
+
+文本在进行存储时会选择文本的格式。文本常用表示格式分为二进制(无格式)、文本(ASCII)、UTF-8和UTF-16
+
+虚幻4中的所有字符串都作为`FString`或者`TChar数组`以`UTF-16`格式存储在内存中。大多数代码假设2个字节等于一个代码点,因此只支持基本多文种平面(BMP),这样虚幻内部编码可以准确地描述为UCS-2。字符串以适合于当前平台的字节次序存储
+
+当向从磁盘序列化到程序包,或者联网区间序列化时,TCHAR字符串小于0xff的字符串均存储为一串8位字节,否则存储为双字节UTF-16字符串。序列化代码可以根据需要处理任何字节次序转换
+
+UE4提供多种字符类型进行数据处理,在不同的情境下,需要选择不同的类型进行操作
+
+> 区别:大小不同、编码方式不同,所有的文本在进行存储的时候,编译器编译阶段会根据编码类型进行转码
+
+```cpp
+//~ Character types.
+/// An ANSI character. Normally a signed type.
+typedef FPlatformTypes::ANSICHAR	ANSICHAR;
+/// A wide character. Normally a signed type.
+typedef FPlatformTypes::WIDECHAR	WIDECHAR;
+/// Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requirements of the licensee.
+typedef FPlatformTypes::TCHAR		TCHAR;
+/// An 8-bit character containing a UTF8 (Unicode, 8-bit, variable-width) code unit.
+typedef FPlatformTypes::CHAR8		UTF8CHAR;
+/// A 16-bit character containing a UCS2 (Unicode, 16-bit, fixed-width) code unit, used for compatibility with 'Windows TCHAR' across multiple platforms.
+typedef FPlatformTypes::CHAR16		UCS2CHAR;
+/// A 16-bit character containing a UTF16 (Unicode, 16-bit, variable-width) code unit.
+typedef FPlatformTypes::CHAR16		UTF16CHAR;
+/// A 32-bit character containing a UTF32 (Unicode, 32-bit, fixed-width) code unit.
+typedef FPlatformTypes::CHAR32		UTF32CHAR;
+```
+
+> 文本类型
+
+```cpp
+// Usage of these should be replaced with StringCasts.
+#define TCHAR_TO_ANSI(str) (ANSICHAR*)StringCast<ANSICHAR>(static_cast<const TCHAR*>(str)).Get()
+#define ANSI_TO_TCHAR(str) (TCHAR*)StringCast<TCHAR>(static_cast<const ANSICHAR*>(str)).Get()
+#define TCHAR_TO_UTF8(str) (ANSICHAR*)FTCHARToUTF8((const TCHAR*)str).Get()
+#define UTF8_TO_TCHAR(str) (TCHAR*)FUTF8ToTCHAR((const ANSICHAR*)str).Get()
+```
+
+> 转码函数
+
+### 对象字符串
+
+1. FName:资源命名字符串,FName通过一个轻型系统使用字符串。在此系统中,特定字符串即使会被重复使用,在数据表中也只存储一次。FName不区分大小写。**他们为不可变,无法被操作**。FNames的存储系统和静态特性决定了通过键进行FNames的查找和访问速度快。FName子系统的另一个功能是使用散列表为FName转换提供快速字符串
+2. FText:表示一个显示字符串,用户的显示文本都需要由FText进行处理。支持格式化文本,**不提供修改函数,无法进行内容修改**(可以用来制作国际化)
+3. FString:可以被操作的字符串。**开销大于其他字符串类型**
+
+```cpp
+	FString str = FString(TEXT("OK"));	// FString构建方式1
+	FString str1(TEXT("OK"));		// FString构建方式2
+	FString str2;				// FString无初始值构建
+
+	GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, str);
+	GEngine->AddOnScreenDebugMessage(-1, 5, FColor::Red, str1);
+	
+	// 普通数据类型转换为FString
+	FString::SanitizeFloat(1.0f);
+	FString::FormatAsNumber(23);
+	FString::FromInt(10);
+
+	bool b = true;
+	b ? TEXT("true") : TEXT("false");
+
+	// FString转为其他类型
+	FCString::Atoi
+	FCString::Atof
+	FCString::Atod
+```
+