# StringHandling
此文为String Handling (opens new window)的原创翻译,本文内容版权归原文所有,仅供学习,如需转载望注本文地址,翻译不易,谢谢理解。
概览UE4中的字符串处理类,还有FName,FText和FString的入门向导。
# FName
当你在内容浏览器中命名一个新的资产时,改变一个动态材质实例的参数,或者获取SkeletalMesh上的一个骨骼,你在使用FNames。FNames提供了一个使用字符串的轻量系统,在这里一个给定的字符在数据表中只存储一次,即使该字符被重用。FNames是大小写敏感的,它们是不可变的而且不能被操作,这样的存储系统和其静态特性意味着它能通过键被很快地查找到并获取值,FName子系统的另外一个特性是使用哈希表来将string更快地转换为FName。
# FText
UE4中处理文本本地化的主要组件就是FText类。所有面向用户的文本都应该使用这个类,因为它提供如下特性支持本地化:
- 逐字地创建本地文本
- 格式化文本(从一个占位符模式生成文本)
- 从数字生成文本
- 从日期和时间生成文本
- 生成其他格式的文本,比如大写或小写
FText有跟AsCultureInvariant函数(或者INVTEXT宏)一样的特性,能创建非本地化,或者"保持相应语言"的文本。这有时是很有用的,比如将玩家名字从一个外部API弄成你想在你用户界面处显示的一些东西。
你可以使用FText::GetEmpty()或FText()来创建一个空的FText。
# FString
不像FName和FText,FString是唯一一个允许操作字符串的类,有很多方法可以操作字符串,包括改变大小写,摘取子字符串,或者反转字符串,FStrings可以被查找,改变和其他字符串比较。但是,这些操作让FStrings比那些不改变字符串的类花销更大。
# 转换
From | To | 例子 |
---|---|---|
FName | FString | TestHUDString = TestHUDName.ToString(); |
FName | FText | TestHUDText = FText::FromName(TestHUDName); |
FString | FName | TestHUDName = FName(*TestHUDString); |
FString | FText | TestHUDText = FText::FromString(TestHUDString); |
FText | FString | TestHUDString = TestHUDText.ToString(); |
FText | FName | 没有直接从FText转换成FName的方法,可以转换成FString再转换成FName。 |
- FName->FText,这个转换过程有时候是合法的,但是FName的内容并不能受益于FText的自动本地化。
- FString->FName,这个转换过程有点危险,因为FName是不区分大小写的,所以这个转换过程是由损耗的。
- FString->FText,这个转换过程有时候是合法的,请意识到FString的内容并不能受益于FText的自动本地化。
- FText->FString,这个转换过程有点危险,从其他语言转换时会有丢失东西的可能。
- FText->FString->FName,这个转换过程有点危险,因为FName是不区分大小写的,所以这个转换过程是由损耗的。
# 字符编码
总的来说,你应该在设置字符串变量字面量时使用TEXT()宏,如果你不指定TEXT()宏,你的字面量是用ANSI编码的,这会被它所支持的字符集极大地限制,任何被传到FString的ANSI字面量需要转换成为TCHAR(本地Unicode编码),所以说使用TEXT()更有效率。
为了找到更多信息,请查看Character Encoding (opens new window)