最初に
どうも、ろっさむです。
今回はUE4で文字列を扱う際に使用する TEXT()
についてまとめようと思います。
UE4での文字列リテラルの扱い
UE4では文字列変数のリテラル(変数や定数以外の数値や文字列などの値の総称)をそのまま使用した場合は、ANSIを使用してエンコードされます。
FString Name = "piyo";
ANSIとは一体なんでしょう?
詳しい説明に関しては省きますが、8bit(1文字を7bit、誤り検出用に1bit)で128文字(制御文字、英数字、記号等)を表します。サポートされる文字は非常に限られますが、コンピュータやその他の通信機器などで最もよく使われているようです。
つまり、リテラルの状態からFString
にそのまま入れようとすると、まずエンジン側でリテラルをANSIを使用してエンコードし、メモリに保存します。そのあとに、FString
に入れるためにUnicodeでUTF-16エンコーディングを行い、再度メモリに保存します。2回エンコードがされています。
UnicodeとUTF-16に関しては以下の記事がわかりやすいです。
Unicodeは、文字集合です。世界中の文字を集めたものでそれぞれの文字に番号が振られています。
UTF-16とUTF-8は符号化方式です。パソコンで使用するためにUnicodeを変換した番号が振られています。
UTF-16とUTF-8の振られた番号は別々ですが、同じ文字集合のUnicodeから変換されているので持っている文字の種類は同じです。
TEXT()
というマクロを使用することによって、リテラルはANSIとしての保存はされず、そのままUnicodeでUTF-16エンコーディングが行われ、メモリに保存されます。
このことから、文字列変数用のリテラルはTEXT()
を使用することで1回のエンコードで済み、効率よくリテラルを扱えるということになります。
FString Name = TEXT("piyo");
なんとなくでTEXT()
を使ってた方も、これで納得しながら使えますね。
参考
- https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/StringHandling/CharacterEncoding/index.html
- https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/StringHandling/index.html
- https://itsakura.com/it-unicode-utf
- https://wa3.i-3-i.info/diff406moji.html
- https://www.slideshare.net/ufcpp/unicode-228059981