글 작성자: Doublsb

무언가의 객체에 대한 ToString()은 별 신경을 쓰지 않고 사용하기 쉬운 메서드이지만,
글로벌 런칭을 주로 한다면 생각보다 사용에 주의가 필요하다.

 

DateTime 파싱

데이터에는 보통 생성 시간이나 수정 시간이 들어가지만, 유니티에서는 DateTime을 Serialize하지 못한다.

이 때문에 나는 보통 DateTime을 String으로 바꿔 저장하고, 불러올 때에는 DateTime.Parse를 쓰고 있다.

//세이브 할 때
UtcNow_string = DateTime.UtcNow.ToString();
//로드 할 때
UtcNow_dateTime = DateTime.Parse(UtcNow_string);

하지만 세이브와 로드 사이에 언어권이 변경되는 경우 이 구문은 오류가 날 수 있다.

DateTime.UtcNow.ToString()을 한국어 기반의 OS에서 실행할 경우, 아래와 같은 결과값이 나온다.

2023-02-16 오전 7:29:53

그리고 이를 저장해뒀다가, 로드하기 전에 프랑스 언어권(…)으로 바꾸고 로드하면 오류가 날 것이다.

이를 방지하기 위해, DateTime.UtcNow.ToString(DateTimeFormatInfo.InvariantInfo)를 사용하는 습관을 들이자.

DateTimeFormatInfo.InvariantInfo는 언어권에 관계 없는 DateTime String을 던져 줄 것이다.

 

Char.ToLower()

영문 대문자를 소문자로 바꿀 때에, 별 생각 없이 Char.ToLower()를 쓰기 마련이다.

하지만 여러분의 불길한 예상처럼 이 메서드도 별 생각 없이 쓸 수 없다.

Console.WriteLine("I".ToLower(new CultureInfo("en-US", false)));
Console.WriteLine("I".ToLower(new CultureInfo("tr-TR", false)));

//Output is
//i
//ı

보시다시피 영어와 튀르키예의 i는 매우 다르다. 라틴어도 i가 다르며, 그 외의 다양한 국가에서도 일부 알파벳이 다를 수 있다.

영어를 명시하여 사용하고 싶다면 new CultureInfo("en-US", false)를 사용해야 한다.

반응형