그냥 게임개발자
FString과 TCHAR 본문
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);