그냥 게임개발자

FString과 TCHAR 본문

Unreal스터디/FString

FString과 TCHAR

sudoju 2024. 1. 1. 15:36

TCHAR 배열을 사용한 문자열 출력

void UMyGameInstance::Init()
{
	Super::Init();
	static const TCHAR LogCharArray[] = TEXT("Hello Unreal");
	UE_LOG(LogTemp, Log, LogCharArray);
}

TEXT는 기본적으로 TCHAR의 배열이다.

UE5.1버전에서는 UE_LOG가 TCHAR 배열을 그냥 써도 오류가 나지 않았지만, UE5.2 이상 부터는 static const를 지정해줘야 한다.

 

만약 문자열 다양하게 조합하고 싶다면 TCHAR 배열이 아닌 FString을 사용

	FString LogCharString = LogCharArray;
	UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);

UE_LOG 매크로는 3번째 파라미터에는 항상 배열만 들어감

그렇기에 FString을 쓸 수 없지만

%s에 대응될 때는 TCHAR의 포인터 Array를 반환해줘야 한다.

그냥 FString을 쓰면 TCHAR의 포인터가 반환이 되지 않기에

포인터 연산자를 지정해주면 된다.

그러면 FString이 감싸고 있는 실제 문자열 데이터를 가져올 수 있게 된다.

 

복잡한 문자열 처리를 하나로

  • 유니코드를 사용해 문자열 처리를 통일
    • 이 중에서 2byte로 사이즈가 균일한 UTF-16을 사용
    • 유니코드를 위한 언리얼 표준 캐릭터 타입 : TCHAR
  • 문자열은 언제나 TEXT매크로를 사용해 지정(TEXT 매크로는 항상 2byte UTF-16 문자열로 내부에서 반환됨)
    • TEXT매크로로 감싼 문자열은 TCHAR 배열로 지정됨
  • 문자열을 다루는 클래스로 FString을 제공함
    • FString은 TCHAR 배열을 포함하는 헬퍼 클래스

FString 클래스

https://docs.unrealengine.com/5.1/ko/fstring-in-unreal-engine/

 

FString의 구조와 활용

  • 다른 타입에서 FString으로의 변환
    • FString::Printf
    • FString::SanitizeFloat
    • FString::FromInt
  • C런타임 수준에서 문자열을 처리하는 클래스 FCString
    • ex) 문자열을 찾는 strstr을 사용
  • FString에서 다른 타입으로의 변환(안전하지 않으므로 주의)
    • FCString::Atoi
    • FCString::Atof

 

 

TCHAR

TEXT는 기본적으로 TCHAR의 배열이다.

UE5.1버전에서는 UE_LOG가 TCHAR 배열을 그냥 써도 오류가 나지 않았지만, UE5.2 이상 부터는 static const를 지정해줘야 한다.

	static const TCHAR LogCharArray[] = TEXT("Hello Unreal");
	UE_LOG(LogTemp, Log, LogCharArray);

 

FString

	FString LogCharString = LogCharArray;
	UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);

UE_LOG 매크로는 3번째 파라미터에는 항상 배열만 들어감

그렇기에 FString을 쓸 수 없지만 %s에 대응될 때는 TCHAR의 포인터 Array를 반환해줘야 한다.

그냥 FString을 쓰면 TCHAR의 포인터가 반환이 되지 않기에 포인터 연산자를 지정해주면 된다.

그러면 FString이 감싸고 있는 실제 문자열 데이터를 가져올 수 있게 된다.

 

포인터 활용

	// 불변하지 않는 포인터배열을 생성해 FString의 TCHAR의 포인터주소를 가져온다.
	const TCHAR* LongCharPtr = *LogCharString;

	// 포인터를 받아서 직접 고치고 싶으면 FString안에 TArray의 첫번째 인자인 포인터를 가져오는 법
	TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData();

 

복사

	// 배열로 가져오고 싶으면 저수준 복사를 사용
	TCHAR LogCharArrayWithSize[100];		// 배열 크기 설정
				// 복사된 문자열이 저장될 배열, FString의 크기만큼,	 버퍼 지정(복사할 원본 문자열 포인터
	FCString::Strcpy(LogCharArrayWithSize, LogCharString.Len(), *LogCharString);

 

검색과 자르기

	// unreal string이 존재하는지와 조건은 ESearchCase::IgnoreCase(대소문자 구분X)
	//									 ESearchCase::CaseSensitive(대소문자 구분O)
	if (LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase))
	{
		// 몇 번째 인덱스에 unreal이라는 문자가 있는지 찾을 수 있음
		int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase);
		FString EndString = LogCharString.Mid(Index); // EndString은 unreal의 인덱스를 받았기에
		UE_LOG(LogTemp, Log, TEXT("Find Test : %s"), *EndString);	// unreal에 인덱스부터 출력
	}

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

 

변환 작업 int32, float -> FString

	// unreal string이 존재하는지와 조건은 ESearchCase::IgnoreCase(대소문자 구분X)
	//									 ESearchCase::CaseSensitive(대소문자 구분O)
	if (LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase))
	{
		// 몇 번째 인덱스에 unreal이라는 문자가 있는지 찾을 수 있음
		int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase);
		FString EndString = LogCharString.Mid(Index); // EndString은 unreal의 인덱스를 받았기에
		UE_LOG(LogTemp, Log, TEXT("Find Test : %s"), *EndString);	// unreal에 인덱스부터 출력
	}

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

변환 작업 FString -> int32, float

	// ASCII To Int를 활용해 int로 변환
	int32 IntValueFromString = FCString::Atoi(*IntString);
	float FloatValueFromString = FCString::Atof(*FloatString);
	FString FloatIntString2 = FString::Printf(TEXT("Int:%d Float:%f"), IntValueFromString, FloatValueFromString);

	UE_LOG(LogTemp, Log, TEXT("%s"), *FloatIntString2);