[Unity-C#] 특정 국가에서 크래시가 난다면 CultureInfo를 확인하자

Unity 2019부터 .NET 3.5는 더 이상 지원되지 않고, .NET Standard 2.0과 .NET 4.X가 지원된다. .NET Standard 2.0/.NET 4.X은 Unity 2017까지 사용하던 .NET 2.0/.NET 2.0 Subset과 같지 않다. 그래서 글로벌 게임을 서비스 중이라면 CultureInfo로 인해 특정 국가에서 크래시 같은 예기치 않은 상황이 발생하는지 확인해 볼 필요가 있다.

String.ToLower 메서드는 소문자로 변환하기 위해 많이 사용하는 API이다. toLower를 .NET Standard 2.0 기반으로 사용할 때는 CultureInfo를 인자로 추가해야 한다. 만약 toLower()를 CultureInfo 없이 사용할 때는 현재 문화권의 대/소문자 규칙을 고려하여 변경된다. 위의 링크에서 알 수 있듯이 대문자 ‘I’의 경우 터키 언어에서는 소문자 ‘i’와는 다른 문자로 변형되기 때문에 기대와는 달리 터키에서만 다른 문자로 인식될 수 있다. 그렇기 때문에 특정 문화권을 구분하지 않고 사용하기 위해서는 System.Globalization.CultureInfo.InvariantCulture를 인자로 사용하거나 String.ToLowerInvariant() 메서드를 사용해야 한다.

CultureInfo를 사용하는 모든 메서드를 확인해야 한다. DateTime.ToString 메서드도 마찬가지이다. 모두 문화권 형식에 따라 문자열로 변환하는데, 특정 국가에서 연도를 표현하는 ‘yyyy’ 형식이 맞지 않을 수 있다. 그래서 여기에서도 System.Globalization.CultureInfo.InvariantCulture를 사용하여 특정 문화권을 구분하지 않도록 해야 한다. 그렇지 않을 경우 태국이나 사우디아라비아 같은 나라에서 기대하지 않는 결과가 나타날 수 있다.


이 이외에도 여러가지 API를 체크해보아야 한다. 각각을 모두 확인하기 어렵다면 전역 변수로 CultureInfo를 세팅할 수도 있다.

using System.Globalization;

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

CurrentCulture를 InvariantCulture로 글로벌하게 세팅한다면 모든 API가 디폴트로 특정 문화권을 구분하지 않게 될 것이다. 그러나 일부 API에서 의도하지 않은 상황(문화권을 구분)이 필요할 수도 있기 때문에 사용상 주의가 필요하다.

아래의 코드는 모든 CultureInfo를 가져와서 API를 테스트 해보는 코드이다.

CultureInfo[] cinfos = CultureInfo.GetCultures(CultureTypes.AllCultures);
foreach (var info in cinfos)
{ 
    try 
    { 
        Debug.LogFormat("EnglishName:{0}, DisplayName:{1}",	info.EnglishName, info.DisplayName);
    	CultureInfo.CurrentCulture = info;  // 임시로 현재 문화권 설정

    	string d = System.DateTime.Now.ToString("yyyy/MM/dd");  //TEST API
    } 
    catch (System.Exception ex) 
    { 
    	Debug.LogErrorFormat("ex={0}", ex.Message); 
    } 
}

만약, 아래와 같은 익셉션이 발생한다면, 현재 세팅된 문화권과 위의 포맷이 맞지 않는다는 결과이다.

"Not a valid calendar for the given culture."

이를 통해 어떤 언어에서 이슈가 발생하는지도 찾아 볼 수도 있다.


One thought on “[Unity-C#] 특정 국가에서 크래시가 난다면 CultureInfo를 확인하자

Leave a Reply to blueasa Cancel reply

Your email address will not be published. Required fields are marked *