2005-12-11

유니코드 팁

Generic Text Mapping

프로그램을 유니코드에 대응하기 위해서는 모든 single byte char 관련 타입들을 generic macro 를 사용하도록 수정해야 한다.

  • 모든 스트링 리터럴에는 _T 또는 _TEXT 를 붙일 것. 그러나, 특별히 wide string 을 사용할 경우 L"abc" 처럼 L 을 붙일 것
  • 모든 문자 배열에 대해서는 TCHAR 를 사용할 것. 그러나, 특별히 wide char 를 사용할 경우 wchar_t 를 사용할 것.
  • 모든 스트링 포인터에 대해서 LPCTSTR 혹은 LPTSTR 을 붙일 것
  • 스트링 관련 C 함수들에 대한 T 시리즈들을 사용할 것.

XML 과 유니코드

유니코드로 인코딩된 XML 에 한글 엘리먼트 이름을 사용한 경우, 중문 혹은 영문 OS 에서 XPath 검색이 안되는 경우가 있다. 이는 프로그램 자체가 Non Unicode 이기 때문이며, 프로그램 자체를 유니코드로 만들면 문제가 없다.

그러나, 그것이 힘들 경우, Windows XP 이상부터 설정 가능한 Non Unicode Program 의 디폴트 언어를 한글로 지정하면 된다. 단 98 과 같은 오래된 언어에서는 이것이 안되는데, 이를 위해서는 프로그램 코드 자체에 유니코드로 XPath 스트링을 지정하면 된다.

pNode = pXMLDom->selectNodes( L"//캐릭터정보/*" );

STL 과 유니코드

STL은 OS independent 이어야 하므로 vc 전용 매크로인 UNICODE 에 대응되는 어떤 정책도 가지고 있지 않다. 따라서, 개발자가 아래와 같이 자체적으로 typedef 를 해줘야 한다. 단 전자와 같이 새로운 typedef 를 하는 것보다는 이미 존재하는 타입을 사용한 #ifdef 방식이 더 좋다고 한다. (그러고보니 좋은 거 같다.. --)


// ok but not recommended
typedef basic_string〈TCHAR,  char_traits〈TCHAR〉,  allocator〈TCHAR〉〉 tstring;

// better, recommended
#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif

see also:

스트링 길이 문제

  • 문자의 개수 : sizeof(szBuffer) / sizeof(TCHAR)
  • 문자열의 길이 : sizeof(szBuffer) * sizeof(TCHAR)
  • 적절한 매크로를 만들어 사용하면 고민에서 해방될까?

%s 와 %S

만약 UNICODE 어플리케이션일 경우 %s 는 유니코드 문자열이며 %S 는 ANSI 문자열 포맷팅시 사용된다. 물론 MBCS 일 경우라면 반대가 된다.


comments powered by Disqus