TCHAR와 FString

🍋 TCHAR

  • 유니코드를 사용해 문자열 처리를 통일한다.
  • 이중 2byte로 사이즈 균일한 UTF-16을 사용한다.
  • 유니코드를 위한 언리얼 표준 캐릭터 타입: TCHAR
  • 문자열은 언제나 TEXT매크로를 사용한다.
  • TEXT매크로로 감싼 문자열은 TCHAR배열로 지정된다.

🍋FString

FName 이나 FText 와는 달리, FString 은 조작이 가능한 유일한 스트링 클래스입니다. 대소문자 변환, 부분문자열 발췌, 역순 등 사용가능한 메서드는 많습니다. FString 은 검색, 변경에 다른 스트링과의 비교도 가능합니다. 그러나 바로 그것이 FString 이 다른 불변의 스트링 클래스보다 비싸지는 이유입니다.

  • FString은 TCHAR 배열을 포함하는 헬퍼 클래스

Fstring 만들기:

 FString TestHUDString = FString(TEXT("This is my test FString."));

FString 으로

변수 유형 스트링에서 변환 스트링 포맷
float FString::SanitizeFloat(FloatVariable);  
int FString::FromInt(IntVariable);  
bool InBool ? TEXT("true") : TEXT("false"); ‘true’ 거나 ‘false’ 거나
FVector VectorVariable.ToString(); ‘X= Y= Z=’
FVector2D Vector2DVariable.ToString(); ‘X= Y=’
FRotator RotatorVariable.ToString(); ‘P= Y= R=’
FLinearColor LinearColorVariable.ToString(); ‘(R=,G=,B=,A=)’
UObject (InObj != NULL) ? InObj->GetName() : FString(TEXT("None")); UObject 의 FName

FString 에서

FString 에서 intfloat 숫자 변수로의 변환은 물론, 부울 변수로의 변환도 존재합니다.

변수 유형 스트링에서 변환 참고
bool TestHUDString.ToBool();  
int FCString::Atoi(*TestHUDString);  
float FCString::Atof(*TestHUDString);  

Printf

FString::Printf 로 조립된 FString 은 FString 에 저장 가능할 뿐만 아니라, UE_LOG 디버그 메시징 으로 화면에 출력시킬 수도 있습니다. 형식 인수는 지정자는 아래 예제에서 볼 수 있듯이 C++ printf 함수와 같습니다.

FString AShooterHUD::GetTimeString(float TimeSeconds)
{
// 분과 초만 관련이 있습니다.
const int32 TotalSeconds = FMath::Max(0, FMath::TruncToInt(TimeSeconds) % 3600);
const int32 NumMinutes = TotalSeconds / 60;
const int32 NumSeconds = TotalSeconds % 60;

const FString TimeDesc = FString::Printf(TEXT("%02d:%02d"), NumMinutes, NumSeconds);
return TimeDesc;
}

FString 포함을 위해 %s 파라미터를 사용하는 경우, 반드시 연산자를 사용해 줘야 %s 파라미터에 필요한 TCHAR 가 반환됩니다.

비교

오버로딩된 == 연산자를 사용해서 두 FString 을 비교하거나, 하나의 FString 과 TCHAR*s 배열을 비교할 수 있습니다. FString::Equals() 메서드도 있는데, 검사 대상 FString 과, 비교시 대소문자를 무시할 것인지를 나타내는 ESearchCase Enum 을 받습니다. 대소문자 상관없는 비교를 하려는 경우 ESearchCase::IgnoreCase 를, 아닌 경우 ESearchCase::CaseSensitive 를 사용합니다..

TestHUDString.Equals(TEXT("Test"), ESearchCase::CaseSensitive);
	TCHAR LogCharArray[] = TEXT("Hello Unreal");
	UE_LOG(LogTemp, Log, TEXT("%s"), LogCharArray);
	
	FString LogCharString = LogCharArray;
	UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);

	const TCHAR* LogCharPtr = *LogCharString;
	TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData();

	TCHAR LogCharArrayWithSize[12];
	FCString::Strcpy(LogCharArrayWithSize, LogCharString.Len(), *LogCharString);

	if(LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase))
	{
		int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase);
		FString EndString = LogCharString.Mid(Index);
		UE_LOG(LogTemp, Log, TEXT("Find Test: %s"), *EndString);
	}

	FString Left, Right;

	if(LogCharString.Split(TEXT(" "), &Left, &Right))
	{
		UE_LOG(LogTemp, Log, TEXT("Split Test: %s, 와 %s"), *Left, *Right);
	}

	int32 IntValue = 32;
	float FloatValue = 3.14f;

	FString FloatIntString = FString::Printf(TEXT("Int: %d, Float: %f"), IntValue, FloatValue);
	FString FloatString = FString::SanitizeFloat(FloatValue);
	FString IntString = FString::FromInt(IntValue);

	UE_LOG(LogTemp, Log, TEXT("FloatIntString Test: %s"), *FloatIntString);
	UE_LOG(LogTemp, Log, TEXT("FloatString: %s IntString: %s"), *FloatString, *IntString);

	int32 IntValueFromString = FCString::Atoi(*IntString);
	float FloatValueFromString = FCString::Atof(*FloatString);

	UE_LOG(LogTemp, Log, TEXT("IntValueFromString: %d, FloatValueFromString: %f"), IntValueFromString, FloatValueFromString);

image-20240310160919845

🍋FName

언리얼은 FName과 관련 된 글로벌 Pool 자료구조(singleton)를 가지고 있음.

문자열이 들어오면 해시 값을 추출해 키를 생성하고 FName에서 보관

FName값에 저장된 값을 사용해 전역 Pool에서 원하는 자료를 검색해 반환

  • 애셋 관리를 위해 사용되는 문자열 체계.
  • 대소문자 구분없음.
  • 한번 선언되면 바꿀 수 없음.
  • 가볍고 빠름.
  • 문자열을 표현하는 용도가 아닌 애셋 키를 지정하는 용도로 사용. 빌드시 해시값으로 변환.
	FName key1(TEXT("PELVIS"));
	FName key2(TEXT("pelvis"));
	UE_LOG(LogTemp, Log, TEXT("key1 == key2: %d"), key1 == key2);

image-20240310160956626

🍋FText

  • 다국어 지원을 위한 문자열 관리 체계
  • 일종의 키로 작용함.
  • 별도의 문자열 테이블 정보가 추가로 요구됨.
  • 게임 빌드 시 자동으로 다양한 국가별 언어로 변환됨.

References

FString

FName

Leave a comment