그냥 게임개발자

캐릭터 인코딩 문서 파악 본문

Unreal스터디

캐릭터 인코딩 문서 파악

sudoju 2024. 1. 1. 15:33

 

https://docs.unrealengine.com/5.3/ko/character-encoding-in-unreal-engine/

 

텍스트 포맷

  • 텍스트와 스트링을 표현하는 데 사용할 수 있는 포맷을 이해하고 그에 따른 장단점을 이해하는 것은 프로젝트에 어떤 포맷을 사용할 것인지 결정하는 데 도움이 될 수 있다.

ASCII

  • 0, 9, 10, 13, 32 - 126를 포함한 캐릭터

ANSI

  • ASCII와(서유럽 하이 ASCII 등) 현재 코드 페이지는 P4 서버에 바이너리로 저장

UTF-8, UTF-16

  • (ASCII 상위집합인) 특수 캐릭터 시퀀스를 사용하여 비-ANSI 캐릭터를 표현할 수 있는 단일 바이트로 구성된 스트링

 

바이너리의 경우

  • 장점
    • 내부 포맷이 정의되지 않음, 각 파일을 포맷에 관계없이 로드할 수 있음
  • 단점
    • 머지할 수 없음, 이런 종류의 파일은 전부 배타적으로 체크아웃
    • 내부 포맷은 정의되지 않음, 각 파일의 포맷이 다를 수 있음
    • P4는 각 버전 전체를 저장하므로, 디포 크기가 불필요하게 불어날 수 있음

텍스트의 경우

  • 장점
    • 머지할 수 있습니다. 독점 체크아웃할 필요가 없습니다.
  • 단점
    • 매우 제한적입니다. ASCII 캐릭터만 허용

UTF-8의 경우

  • 장점
    • 필요한 모든 문자에 간단히 접근 가능
    • 메모리를 적게 사용
    • ASCII 상위집합, 일반 ASCII 스트링 그대로가 완벽히 UTF-8 스트링이 된다.
    • 스트링이 ASCII이고 그대로 출력하는 것으로 감지되어도 작동한다.
    • 유니코드가 활성화된 서버가 있다면 파일을 머지할 수 있어 독점 체크아웃할 필요가 없음
    • 파싱을 통해 스트링이 (BOM 있든 없든) UTF-8인지 알아낼 수 있음
  • 단점
    • 아시아 언어에는 메모리 프로파일이 다르다.
    • P4 타입 유니코드는 저희 퍼포스 서버에 활성화되어 있지 않음
    • 스트링 연산이 더 복잡, 길이 계산같은 간단한 연산을 할래도 스트링을 파싱해야 함
    • MSDev는 아시아 지역에서 ASCII 이외의 것을 처리하지 못함. 그래서 체크인 도중 텍스트가 ASCII인지 검사

필요할 때 가변으로 집어넣는 방식

메모리를 적게 사용(영문권일 때는 1byte, 아시아 권일 때는 2byte를 혼합된 방식을 사용)

영문권을 사용할 때는 ASCII와 완벽하게 호환이 된다는 것을 의미

 

UTF-16의 경우

  • 장점
    • 필요한 모든 글자에 간단히 접근할 수 있음
    • 단순하다. 메모리 사용량은 글자 수의 두 배
    • 파싱할 필요 없이 스트링을 나누고/합치는 연산이 가능
    • 게임에서 사용된 포맷과 같아, 변환이나 파싱이나 메모리 연산 등이 필요치 않음
    • 머지할 수 있음, 독점 체크아웃 할 필요가 없음
    • C#은 내부적으로 UTF-16을 사용
  • 단점
    • 메모리를 더 사용
    • BOM이 없는 포맷인지 알기 어려움
    • MSDev는 아시아 지역에서 ASCII 이외의 것을 잘 처리하지 못함. 그래서 체크인 도중 텍스트가 ASCII인지 검증하는 것

무조건 2byte로 저장하는 방식

균일된 구성을 가지고 있기 때문에 우리가 데이터를 저장하고자 할 때 정렬된 데이터를 받아올 수 있다는 것

하지만 메모리를 더 많이 사용

 

UE 내부 스트링 표현

  • 언리얼 엔진은 모든 스트링은 FStrings 혹은 TCHAR 정렬 상태로 UTF-16 포맷 메모리로 저장

UE에 로드되는 텍스트 파일

  • 언리얼이 외부 텍스트 파일을 로드할 때 UTF-16파일에서 유니코드 바이트-오더-마크(byte-order-mark, BOM)를 인식하고, 있으면 어느 엔디안으로든 UTF-16으로 파일을 로드한다.

UE에서 사용되는 텍스트 파일용 추천 인코딩

  • INT 와 INI 파일
    • 어느 엔디안이든 UTF-16이다.
    • 아시아 언어에 대한 디폴트 MBCS 인코딩이 WIndows 상에서 작동할 동안, 이 파일들은 PS3와 Xbox360 상에서 로드 될 필요가 있고 변환 코드는 Windows상에서 만 작동
  • 소스 코드
    • 일반적으로 우리는 C++ 소스 코드 안에 스트링을 그대로 쓰는 것은 추천하지 않으며, 그런 데이터는 INT 파일로 보낼 것을 추천
  • C++ 소스 코드
    • UTF-8 혹은 디폴트 Windows 인코딩이다.
    • MSVC, Xbox360 컴파일러와 gcc 모두 UTF-8 인코딩된 소스 파일이면 된다.
    • 가급적이면 UTF-8을 사용해서 저장해라.
  • 변환 루틴
    • 스트링을 다양한 인코딩으로 상호 변환할 수 있는 매크로가 많이 있음
      • TCHAR_TO_ANSI(str)
      • TCHAR_TO_OEM(str)
      • ANSI_TO_TCHAR(str)
      • TCHAR_TO_UTF8(str)
      • UTF8_TO_TCHAR(str)

동아시아 인코딩 고유의 C++ 소스 코드에 대해서

  • UTF-8와 디폴트 Windows 인코딩 모두 C++ 컴파일러와 관련해서 다음과 같은 문제를 야기살 수 있음
  • 즉 잘 모르면 코딩할 때 한국어 쓰지마라.
  • 동아시아어 코멘트의 마지막에 0x5c가 있는 경우, 줄이 없어져 찾기 어려운 버그 또는 오류가 유발될 수 있다.
  •  

UTF-8 같은 경우의 소스 코드를 저장할 때도 BOM이라고 앞에 3byte 헤더가 들어가서 어떤 UTF-8 문서인지 지정하는 헤더가 있는데 윈도우즈 같은 것들은 이것을 헤더를 넣어서 저장을 하는 반면 리눅스는 이것을 읽지 않는다.

 

그렇게 자체적으로 해석하기에 이런 부분에서도 UTF-8을 사용할 때에도 문제가 발생할 수 있다.

결론

즉 언리얼 엔진은 스트링을 관리하는데 있어서 UTF-16을 사용하는데, 꼭 한글을 사용하겠다 싶으면 UTF-8방식으로 저장을 하되 여러가지 문제가 있을 수 있기에 그런 부분은 사전에 감안하고 잘 처리하는 것이 좋다.

'Unreal스터디' 카테고리의 다른 글

인터페이스란?  (0) 2024.01.01
Assert(어썰트)  (0) 2024.01.01
언리얼 오브젝트 처리  (1) 2024.01.01
리플렉션 시스템이란?  (0) 2024.01.01
언리얼 오브젝트란  (1) 2024.01.01