[C]Unicode
(1) Unicode text와 문자열
Windows 98 API는 부분적으로 유니코드 문자열을 지원하였다. Windows 2000과 NT API는 유니코드와 ANSI 문자열을 지원한다. 그러나 Windows CE는 Unicode만 지원한다.
MBCS : Multi-Byte Character String. 특수문자 다음에 나오는 문자는 서로 다른 문자체계의 문자임을 알려 주는 구분자로 사용.
Unicode : Wide byte character 방식. ANSI 문자의 경우 상위 바이트는 NULL이 되며, 압축 알고리즘에서는 이 반복적으로 발생되는 NULL을 최적화한다.
(2) 일반 문자열과 문자 데이터
유니코드 데이터 형인 wchar_t를 사용할 수도 있으나, tchar.h를 include 시키고, TCHAR 데이터형을 사용하여 definition에 따라 char나 wchar_t형으로 적절히 변환할 수 있다.
#define _UNICODE // TCHAR을 wchar_t 형으로 대치
#define _MBCS // TCHAR을 char 형으로 대치
문자열 포인터는 LPSTR 데이터형 대신 LPTSTR 데이터형을 사용하여 definition에 따라 char *나 wchar_t * 형으로 적절히 변환할 수 있다.
(3) 상수문자열
LPTSTR lpszStr = "My string"; // 문자열을 ANSI 문자열로 간주,
// 데이터형 불일치로 에러 발생
LPTSTR lpszStr = _T("My string"); // _UNICODE가 정의되어 있으면 _T()는 유니코드
// 문자열 상수로 변환하고, _MBCS가 정의되어 있으면
// ANSI 문자열 상수로 변환한다.
LPTSTR lpszStr = TEXT("My string"); // 상동
LPWSTR lpszStr = L("My string"); // 유니코트 문자열로 지정하는 매크로 함수 L()
(4) 문자열 버퍼 길이 계산
#define _UNICODE
TCHAR szBuffer[200]; // szBuffer의 크기는 400 bytes
DWORD dwlen;
dwlen = sizeof(szBuffer); // 400 bytes
dwlen = sizeof(szBuffer) / sizeof(TCHAR); // 실제 저장 가능한 유니코드 문자 개수는 200개
(5) 표준 문자열 라이브러리 함수
표준 C 런타임 함수 strlen()에 해당하는 유니코드 함수는 wcslen()이지만, _tcslen()을 사용하면 definition 정의에 따라 컴파일시에 적절히 변환된다.
기능 ANSI 함수 유니코드 함수 일반 문자열 함수
================================ ============ ============= ==================
문자열의 길이를 반환하는 함수 strlen() wcslen() _tcslen()
두 문자열을 접합하는 함수 strcat() wcscat() _tcscat()
문자열에서 문자를 찾는 함수 strchr() wcschr() _tcschr()
두 문자열을 비교하는 함수 strcmp() wcscmp() _tcscmp()
문자열을 복사하는 함수 strcpy() wcscpy() _tcscpy()
부분 문자열을 찾는 함수 strstr() wcsstr() _tcsstr()
문자열을 역순으로 저장하는 함수 strrev() _wcsrev() _tcsrev()
================================ ============ ============= ==================
(6) ANSI 문자열과 Unicode 문자열 간의 변환
mbstowcs(WCHAR *des, char *src, int BufferSize) :
Multi-Byte String을 Wide Character String(유니코드)으로 변환.
wcstombs(char *des, WCHAR *src, int BufferSize) :
Wide Character String(유니코드)을 Multi-Byte String으로 변환.