FName
When you name a new asset in the Content Browser, change a parameter in a Dynamic Material Instance, or access a bone in a Skeletal Mesh, you are using FNames. FNames provide a very lightweight system for using strings, where a given string is stored only once in a data table, even if it is reused.
FNames are case-insensitive. They are immutable, and cannot be manipulated. The storage system and static nature of FNames means that it is fast to look up and access FNames with keys. Another feature of the FName subsystem is the use of a hash table to provide fast string to FName conversions.
FText
In Unreal Engine (UE) the primary component for text localization is the FText
class. All user-facing text should use this class, as it supports text localization by providing the following features:
-
Formatting Text (to generate text from a placeholder pattern).
-
Generating derived text, such as making text upper or lower case.
FText
also features the AsCultureInvariant
function (or the INVTEXT
macro), which creates non-localized, or "culture invariant" text. This is useful for things like converting a player name from an external API into something you can display in your user interface.
You can create a blank FText
using either FText::GetEmpty()
, or by using just FText()
.
FString
Unlike FName
and FText
, FString
can be searched, modified, and compared against other strings. However, these manipulations can make FStrings
more expensive than the immutable string classes. This is because FString
objects store their own character arrays, while FName
and FText
objects store an index to a shared character array, and can establish equality based purely on this index value.
Printf
The FString
function, Printf
, can create FString
objects the format argument specifiers as the C++ printf
function. Similarly, the UE_LOG
macro prints a printf
formatted string to the screen, log output, and log files, depending on what type of UE4 build is running.
Remember that to use these strings and conversion you will need to include the necessary header files. A list of which header files are needed can be found on the API reference page for each string.
Conversions
From | To | Example |
---|---|---|
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 | There is no direct conversion from FText to FName. Instead, convert to FString and then to FName. |
FString | int32 | int32 TestInt = FCString::Atoi(*MyFString); |
FString | float | float TestFloat = FCString::Atof(*MyFString); |
int32 | FString | FString TestString = FString::FromInt(MyInt); |
float | FString | FString TestString = FString::SanitizeFloat(MyFloat); |
Encoding
In general, you should be using the TEXT() macro when setting string variable literals. If you do not specify the TEXT() macro, your literal will be encoded using ANSI, which is highly limited in what characters it supports. Any ANSI literals being passed into FString need to undergo a conversion to TCHAR (native Unicode encoding), so it is more efficient to use TEXT().
For more about encoding, see the Character Encoding documentation.