前言
刚接触UE4 C++的时候,面临最多的疑问就是为啥有FString、FText、FName这三种字符串,并且赋值的时候还得用TEXT("")宏。
为啥不直接像C++中std:string的那么使用
std::string s = "hello world!";
原因:首先是性能、然后是多语言的考虑。
FString、FText、FName的区别
FString
FString是可变字符串,其跟std::string基本一样,有很多的操作字符串的方法,可以在运行时修改。
FText
FText是不可变字符串,主要用于多语言和本地化
FName
FName是不可变字符串,主要用于名字等标识,会在声明时计算hash值,在后续进行比较时直接比较hash值,而不是像字符串那样进行比较,提高了性能。
国际化与编码
TEXT宏
未指定 TEXT() 宏,将使用 ANSI 对文字进行编码,会导致支持字符高度受限。 传入 FString 的 ANSI 文字需要完成到 TCHAR 的转换(本地万国码编码),以便更高效地使用 TEXT()。
LOCTEXT宏
通过定义密钥和源字符串创建本地化的文本片段,用"LOCTEXT_NAMESPACE"定义命名空间。
NSLOCTEXT宏
通过定义命名空间、密钥和源字符串创建本地化的文本片段。
// 定义要与LOCTEXT一起使用的命名空间
// 这只在单个文件中有效,并且必须在文件结束前取消定义
#define LOCTEXT_NAMESPACE "MyNamespace"
// 创建文本文字值
constFTextHelloWorld= NSLOCTEXT("MyOtherNamespace","HelloWorld","Hello World!")
constFTextGoodbyeWorld= LOCTEXT("GoodbyeWorld","Goodbye World!")
// 在文件结束前取消定义命名空间
#undef LOCTEXT_NAMESPACE
拓展:UE5如何进行多语言与国际化处理
参考链接
https://docs.unrealengine.com/4.26/zh-CN/ProductionPipelines/Localization/Formatting/