[UE5] 스트링 처리
스트링 처리
FName
다음과 같이 에셋을 관리하기 위해 사용되는 문자열 체계입니다.
콘텐츠 브라우저에서 새 에셋 이름을 지을 때, 다이내믹 머티리얼 인스턴스의 파라미터를 변경할 때, 스켈레탈 메시에서 본에 접근할 때 등의 상황에서 FName
을 사용합니다.
FName
은 대소문자를 구분하지 않으며, 소유 스트링 테이블에 대한 인덱스와 인스턴스 번호의 조합으로 저장됩니다.
한 번 선언되면 변경이 불가능하고, 조작할 수 없습니다.
FNamePool
이라는 이름을 가진 해시 테이블에서 FName
을 키 값으로 사용해 관리됩니다.
FNamePool
은 싱글톤 자료구조로 돼있습니다.
FName
의 정적인 속성과 저장 시스템 덕에 찾기나 키로 FName에 접근하는 속도가 빠릅니다.
스트링에서 FName변환이 해시 테이블을 사용해서 빠릅니다.
생성
다음과 같은 방법으로 생성 할 수 있습니다.
FName TestName = FName(TEXT("ThisIsMyTestFName"));
형변환
FName
은 FString
과 FText
로만 변환 할 수 있습니다.
FString
에서만 FName
으로 변환 가능합니다.
이때 FName
은 대소문자 구분이 없으므로 데이터 손실에 주의해야합니다.
NameTypes.h
의 INVALID_NAME_CHARACTERS
매크로가 FName
에서 사용할 수 없는 글자를 정의합니다.
From | To | 예시 |
---|---|---|
FName | FString | TestName.ToString() |
FName | FText | FText::FromName(TestName) |
FString | FName | FName(*TestString) |
Enum | FName |
네임 테이블 검색하기
네임 테이블은 문자열 식별을 관리합니다.
이 곳에서 FName
이 네임 테이블 안에 있는지 알아내고 싶은데 자동으로 추가되도록 하고 싶지는 않은 경우, FName
생성자에 다른 검색 유형을 대주면 됩니다
if( FName(TEXT("pelvis"), FNAME_Find) != NAME_None )
{
// Do something
}
네임 테이블에 이름이 존재하지 않는 경우, FName
의 Index 가 NAME_None
으로 설정됩니다.
참고로 일반 스트링에 하듯이 NULL 포인터 검사를 하지는 않습니다.
FText
FText
는 텍스트 현지화를 위한 주요 컴포넌트 클래스입니다.
모든 사용자 대상 텍스트는 이 클래스를 사용해야 합니다.
현지화가능 텍스트는 세 가지 구성 요소로 이루어져있습니다.
네임스페이스(namespace), 키(key), 소스 스트링(source string)입니다.
스트링 테이블이 필요합니다. 스트링 테이블을 생성하는 자세한 방법은 스트링 테이블 문서에서 알아볼 수 있습니다.
생성
텍스트 생성 유형은 세 가지, 숫자(numerical), 연대(chronological), 변환(transformative)입니다.
C++에서 생성하는 방법에 대해서 알아보겠습니다.
C++이외에 블루프린트에서 생성하는 방법이나 보다 더 자세한 설명은 텍스트 생성에서 알아볼 수 있습니다.
숫자
숫자 유형을 사람이 읽기 좋은 텍스트 표현으로 변환하는 데 사용됩니다.
그 정확한 규칙은 컬처에 따라 다르며, 구체적인 제어가 필요한 경우 생성 단위에 따라 조정할 수도 있습니다.
예를 들어, 기본 생성 규칙에 따라 부동소수점 수치 “1234.5” 는 영어에서 “1,234.5” 로, 프랑스어에서 “1 234,5” 로, 아랍어에서 “١٬٢٣٤٫٥” 로 생성됩니다.
함수 | 설명 | 예시 |
---|---|---|
FText::AsNumber | UE4에 지원되는 숫자 유형을 사용자가 읽기 좋은 텍스트 표현으로 변환합니다. | “1234.5”는 “1,234.5”가 됩니다. |
FText::AsPercent | float 또는 double을 퍼센트 텍스트 표현으로 변환합니다. | “0.2”는 20%가 됩니다. |
FText::AsMemory | 바이트 단위 값을 사용자가 읽기 좋은 메모리 표현으로 변환합니다. | “1234”는 “1.2 KiB”가 됩니다. |
FText::AsCurrencyBase | 통화의 기반 표현 단위 값을 사용자가 읽기 좋은 통화 표현으로 변환합니다. | “123450” “USD”는 “$1,234.50”가 됩니다. |
연대
연대 생성은 날짜와 시간 유형을 사람이 읽기 좋은 텍스트 표현으로 변환하는 데 사용합니다.
그 정확한 규칙은 컬처에 따라 다르며, 보다 구체적인 제어가 필요한 경우 날짜/시간 스타일을 생성 단위 별로 조절할 수 있습니다.
기본 생성 규칙에 따라, 1998년도 5번째 달 22번째 날을 나타내는 연대는 미국 영어에서 “May 22, 1998”, 영국 영어에서 “22 May 1998”, 프랑스어에서 “22 mai 1998”, 아랍어에서 “٢٢/٠٥/١٩٩٨” 이 됩니다.
함수 | 설명 | 예시 |
---|---|---|
FText::AsDate | FDateTime 값을 사용자가 읽기 좋은 날짜 표현으로 변환합니다. | Monday, July 8, 2024 |
FText::AsTime | FDateTime 값을 사용자가 읽기 좋은 시간 표현으로 변환합니다. | 오후 4시 30분 15초 협정 세계시 |
FText::AsDateTime | FDateTime 값을 사용자가 읽기 좋은 날짜와 시간 표현으로 변환합니다. | 2024년 7월 8일 월요일 오후 4시 30분 15초 협정 세계시 |
FText::AsTimespan | FTimespan 값을 사용자가 읽기 좋은 델타(경과) 시간 표현으로 (시간, 분, 초 단위) 변환합니다. | 5 hours, 45 minutes, 30 seconds |
시간 생성에서 기본으로 기대하는 값은 UTC 기반 시간입니다.
이것을 현지 시간대로 변환합니다.
변환
변환 생성은 텍스트를 다른 표현으로 변환하는 데 사용합니다.
예를 들어 소문자 텍스트를 대문자로, 또는 대문자를 소문자로 변환할 수 있습니다.
함수 | 설명 |
---|---|
FText::ToLower | FText 인스턴스를 유니코드 호환 소문자 형태로 변환합니다. |
FText::ToUpper | FText 인스턴스를 유니코드 호환 대문자 형태로 변환합니다. |
형변환
FText
는 FString
로만 변환 할 수 있습니다.
FString
과 FName
둘 다 FText
으로 변환 가능합니다.
From | To | 예시 |
---|---|---|
FText | FString | TestText.ToString() |
FString | FText | FText::FromString(TestString) |
FName | FText | FText::FromName(TestName) |
FText
를 FString
으로 변환하는 것은 일반적으로 텍스트 히스토리를 잃어버리는 손실성 작업입니다.
현지화 데이터가 더이상 필요치 않은 경우에만 수행해야 합니다.
예를 들어, 하위 API 가 있는데 스트링에 작동하고, 그 스트링은 텍스트 변경을 감시하는 상위 API 에 관리받는 경우입니다 (예: STextBlock).
이 변환은 스트링만 받는 외부 API 로 데이터를 전달할 때도 사용할 수 있습니다.
FString
FString
은 FName
이나 FText
와는 달리 조작이 가능한 유일한 스트링 클래스입니다.
대소문자 변환, 부분문자열 발췌, 역순 등 사용 가능한 함수가 많습니다.
검색, 변경, 비교도 가능합니다.
생성
다음과 같은 방법으로 생성 할 수 있습니다.
FString TestHUDString = FString(TEXT("This is my test FString."));
형변환
From | To | 예시 |
---|---|---|
FString | FName | FName(*TestString) |
FString | FText | FText::FromString(TestString) |
FName | FString | TestName.ToString() |
FText | FString | TestText.ToString() |
FString
에서 FName
으로 형변환 할 때 FName
은 대소문자 구분이 없으므로 데이터 손실에 주의해야합니다.
FText
에서 FString
으로 형변환 할 때 FString
은 텍스트 현지화를 위한 데이터와 테이블이 없으므로 데이터 손실에 주의해야합니다.
숫자 및 기타 변수는 다음과 같습니다.
From | To | 예시 |
---|---|---|
float | FString | FString::SanitizeFloat(FloatVariable) |
int | FString | FString::FromInt(IntVariable) |
bool | FString | InBool ? TEXT(“true”) : TEXT(“false”) |
FVector | FString | VectorVariable.ToString() |
FVector2D | FString | Vector2DVariable.ToString() |
FRotator | FString | RotatorVariable.ToString() |
FLinearColor | FString | LinearColorVariable.ToString() |
UObject | FString | (InObj != NULL) ? InObj->GetName() : FString(TEXT(“None”)) |
FString
에서 int
나 float
숫자 변수로의 변환은 물론, 부울 변수로의 변환도 존재합니다.
From | To | 예시 |
---|---|---|
FString | bool | TestHUDString.ToBool() |
FString | int | FCString::Atoi(*TestHUDString) |
FString | float | FCString::Atof(*TestHUDString) |
Printf
FString
함수 Printf
는 C++ printf
함수와 같은 포맷 실행인자 지정자로 FString
오브젝트를 생성할 수 있습니다.
마찬가지로 UE_LOG
매크로는 실행 중인 UE4 빌드 타입에 따라 printf
포맷의 문자열을 화면, 로그 출력, 로그 파일에 출력합니다.
인코딩
일반적으로 문자열 변수 리터럴을 설정할 때는 TEXT() 매크로를 사용해야 합니다.
TEXT() 매크로를 지정하지 않으면 리터럴은 지원되는 문자가 매우 제한되는 ANSI를 사용하여 인코딩됩니다.
FString
에 전달되는 모든 ANSI 리터럴은 TCHAR(네이티브 유니코드 인코딩)로 변환해야 하므로 TEXT()를 사용하는 것이 더 효율적입니다.
인코딩에 대한 자세한 정보는 캐릭터 인코딩 문서에서 볼 수 있습니다.
댓글남기기