'localization'에 해당되는 글 1건

  1. 2007/10/30 영문 대문자를 소문자로 변환하는 방법

대문자를 소문자로 변환하는 방법은 대단할게 없다. 다 알고 있는 다음 두 가지중 하나를 상황에 맞게 사용하면 된다.

int tolower(int c);
char* _strlwr(char* str);

MS Visual C++의 경우에는 2005 버전으로 넘어오면서 strlwr라는 이름이 _strlwr로 수정되었다. MSDN만을 읽어보면 _strlwr가 ISO C++을 준수한다고 하는데 자세한 사정은 잘 모르겠다. ANSI C의 경우에는 strlwr, _strlwr가 모두 존재하지 않는다. C++ 확장에만 들어 있다.

영문 환경이라면 저 두 함수는 아주 멋지게 작동을 하고, 어디 잘못될 곳도 없다. Microsoft는 저 두 함수를 다국어 환경에 맞추기 위해서

_totlower, _mbctolower, towlower
_tcslwr, _mbslwr, _wcslwr

를 추가했다(Secure 버전은 별도). TCHAR형을 사용하면 빌드 환경에 따라 문자 데이터 형을 바꿔주니 무난하게 사용을 할 수 있다. 당신이 영어 사용권에 살고 있다면 알고 있어야할 지식은 여기까지다. 여기까지만 알고 있어도 세상살이가 그다지 고달프지 않다.

문제는 아시아권 특히 일본어가 사람을 괴롭힌다. 일본 문자인 "ダ"를 보자. 유니코드가 아닌 Shift-JIS 코드를 사용할때 저 문자의 코드값은 0x83(-125), 0x5F(95)의 두 바이트가 된다. 아래의 코드 조각을 보자.

사용자 삽입 이미지

















그림에서 보듯이 _mbslwr를 거치면서 lwr의 값이 ""로 바뀌게 되고, oops를 출력하게 된다. 이는 한글 윈도우에서 실행한 결과이기 때문이며, 같은 바이너리를 일본어 윈도우에서 실행한다면 same을 출력한다(실제로 그렇다).

여기까지는 좋다. 테스트 결과에 의해 일본어 윈도우에서 정상적으로 작동할 것이라는 가정을 가지고 일을 하면 되니까. 며칠전 이상한 버그가 보고 돼 조사를 하고 있었는데, 결론은 저 _mbslwr가 이상한 행동을 한다는 것이다. 제대로 된 개발을 한다면 언어별로 윈도우를 설치하고 다 테스트를 해봐야겠지만, 실제는 그렇지 못하고 저 위의 코드는 그 나라에서는 정상적으로 작동한다고 가정을 할 수밖에 없다(변명일지도...).

코드를 최대한 손대지 않고 수정하기 위해서 로켈등 관련부분을 다양하게 적용해봤지만 아무런 소용이 없었다. 결국 문자열을 유니코드로 수정->변환->다시 DBCS로 수정해 저장하는 이상한 짓을 하고 말았다. 당면한 문제는 일단 수습을 했지만, 내가 모르는 무엇인가가 작용을 하고 있다는 사실이 대단히 기분 나쁘다.

준비중인 차기작은 모두 유니코드를 사용하기때문에 이런 문제를 겪지는 않겠지만, 당장에 널려 있는 코드들도 문제고 저안에서 무슨 일이 일어나고 있는지 모르고 있다는 사실이 더 큰 문제다. 그러나 일본어 윈도우를 설치하기는 싫다 -_-;;

ps. 참고로 환경은 VS2005(sp1 미적용), windows xp, windows 2003이다.

Posted by 조성경 트랙백 0 : 댓글 0