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 4 (UE4) 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 is the only string class that allows for manipulation. There are many methods available for string manipulation, including case changing, excerpting substrings, and
reversing. FStrings can be searched, modified, and compared against other strings. However, these manipulations can make FStrings more expensive than the immutable string classes.
Conversions
From |
To |
Example |
---|---|---|
FName |
FString |
|
FName |
FText |
FName -> FText is valid in some cases, but be aware that the FNames's content will not benefit from the FText's "auto localization". |
FString |
FName |
FString -> FName is dangerous as the conversion is lossy as FName's are case insensitive. |
FString |
FText |
FString -> FText is valid in some cases, but be aware that the FString's content will not benefit from the FText's "auto localization". |
FText |
FString |
FText -> FString is dangerous as it is a potentially lossy conversion for some languages. |
FText |
FName |
There is no direct conversion from FText to FName. Instead, convert to FString and then to FName. FText -> FString -> FName is dangerous as the conversion is lossy as FName's are case insensitive. |
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.