메모내용

FString

FString & TCHAR

언리얼에서는 복잡한 문자열 처리를 하나로,
유니코드를 사용해 문자열 처리를 통일합니다

문자열은 기본적으로 TCHAR 의 배열이다
문자열을 조작하고 싶으면 TCHAR 배열을 건드리는 것이 아니라 , FString 을 사용하도록 한다.

                
                    TCHAR CharArray[] = TEXT("Unreal Character");
                    UE_LOG(LogTemp, Log, LogCategory); // 매크로의 3번째 인수는 항상 배열만 된다.

                    FString LogCharString = CharArray; // TCHAR 배열을 받을 수 있다.
                    UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString);
                    // FString 에서 문자열 배열을 가져오려면 포인터연산을 수행해주어야 한다.  
                    // 포인터 연산을 수행해야. FString 이 감싸고 있는 문자열을 반환한다.
                
            

FString

Character 의 동적 배열을 소유하고 있는 클래스

FString 내부 동작

FString 은 안에 TArray를 관리하고 있어서 TCHAR 를 보관한다. 또한 FString 이 제공하는 함수들은, 내부적으로 FCString 클래스가 있으며, 이것은 C 라이브러리에서 제공하는 C 함수를 포함하는 클래스 이다. 문자열을 찾거나 자르거나 합치는 함수 같은것은 FCString 을 이용한다.

다른 타입에서 FString 으로의 변환

  • FString :: Printf

      복잡한 문자열의 만들고 싶을때
      
          FString str = TEXT("str");
          FString ResultString = FString::Printf(TEXT(" integer : %d, float : %.2f , string :  %s"), 10, 0.02,*str );
      
                                              

  • FString :: SanitizeFloat
    : float 로부터 FString 으로 변환
  • FString :: FromInt
    : int 로부터 FString 으로 변환

C 런타임 수준에서 문자열을 처리하는 클래스 FCString

예 ) 문자열을 찾는 strstr 을 사용

FString 에서 다른 타입으로의 변환 (안전하지는 않으므로 주의)

  • FCString :: Atoi
    : 아스키 코드에서 integer 로 변환
  • FCString :: Atof
    : 아스키 코드에서 float 로 변환

종합


    // TEXT 매크로는 TCHAR 배열을 반환합니다.
    TCHAR LogCharArray[] = TEXT("Hello Unreal");
    UE_LOG(LogTemp,Log, LogCharArray);

    // TCHAR 배열로 FString 초기화 하기, UE_Log 는 문자열(문자 배열)을 받습니다.
    FString LogCharString = LogCharArray;
    UE_LOG(LogTemp, Log, TEXT("%s"), *LogCharString); 

    // FString 의 포인터 연산은 const TCHAR* 를 반환합니다. 즉 포인터 연산으로 받은 문자열은 수정할 수 없습니다.
    const TCHAR* LogCharPtr = *LogCharString;

    // FString 의 내부 Array 에 접근하여 data 를 받으면 문자열을 수정할 수 있습니다. 포인터연산을 통해
    TCHAR* LogCharDataPtr = LogCharString.GetCharArray().GetData();

    // 수정할 수 있는 배열로 받고 싶다면, C 스타일의 함수를 사용해야 합니다
    TCHAR LogCharArrayWidthSize[100];
    TCString::Strcpy(LogCharArrayWidthSize, LogCharString.Len(), *LogCharString);

    // 특정 문자열이 있는지 검사
    if(LogCharString.Contains(TEXT("unreal"), ESearchCase::IgnoreCase))
    {
        // 몇번째 인덱스에 있는지 찾아보기
        int32 Index = LogCharString.Find(TEXT("unreal"), ESearchCase::IgnoreCase));
        
        // 자르기
        FString EndString = LogCharString.Mid(Index); // "Unreal"
    }

    // 나누기
    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.141592;

    FString FloatIntString = FString::Printf(TEXT(" Int : %d, Float : %f"), IntValue, FloatValue);
    
    // Float 를 그대로 스트링으로 바꾸기. (float 은 내부적으로 규약이 복잡하여 정제할 필요가 있다. 때문에 SanitizeFloat 을 사용한다)
    FString FloatString = FString::SanitizeFloat(FloatValue);

    // Integer 를 그대로 스트링으로 바꾸기
    FString IntString = FString::FromInt(IntValue);

    // FString 을 float 으로 바꾸기
    float FloatValueFromString = FCString::Atof(*FloatString);

    // FSTring 을 int 로 바꾸기
    int IntValueFromString = FCString::Atoi(*IntString)