일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- request
- C
- windows
- WebProgramming
- 포인터
- HTML
- function
- query
- 악성코드
- OOP
- jsp
- CLASS
- 자료구조
- 투자
- System
- CSS
- Sort
- API
- 노드
- beans
- meta
- JavaScript
- 윈도우즈
- java
- c++
- algorithm
- Call-by-reference
- UTF-8
- Kafka
- array
Archives
- Today
- Total
hahahia
아스키코드 vs 유니코드(02. MBCS와 WBCS의 동시 지원) 본문
1. #include <windows.h>
- Windows에서 정의하고 있는 자료형
typedef char CHAR;
typedef wchar_t WCHAR;
#define CONST const;
typedef CHAR* LPSTR;
typedef CONST CHAR* LPCSTR;
typedef WCHAR* LPWSTR;
typedef CONST WCHAR* LPCWSTR;
자료형을 정의하는 이유
1. 선언의 편리성
긴 문장을 대신해서 간결하고, 또 의미도 보다 강하게 부여된 이름을 변수 선언시 사용한다.
typedef unsigned int size_t
2. 확장의 용이성
typedef unsigned char STR_LEN -> typedef unsigned int STR_LEN
(한번의 수정으로 STR_LEN 자료형을 쓰는 모든 변수가 char->int 로 확장되었다
#include <stdio.h>
#include <windows.h>
int wmain(int argc, wchar_t* argv[])
{
LPSTR str1 = "SBCS Style String 1";
LPWSTR str2 = L"WBCS Style String 1";
CHAR arr1[] = "SBCS Style String 2";
WCHAR arr2[] = L"WBCS Style String 2";
LPCSTR cStr1 = arr1;
LPCWSTR cStr2 = arr2;
printf("%s\n", str1);
printf("%s\n", arr1);
wprintf(L"%s\n", str2);
wprintf(L"%s\n", arr2);
return 0;
}
실행결과
SBCS Style String 1
SBCS Style String 2
WBCS Style String 1
WBCS Style String 2
정리해보면 다음과 같다.
매크로 UNICODE가 정의되면...
TCHAR arr[10]; => WCHAR arr[10]; => wchar_t arr[10];
매크로 UNICODE가 정의되지 않으면...
TCHAR arr[10]; => CHAR arr[10]; => char arr[10];
실행결과
SBCS Style String 1
SBCS Style String 2
WBCS Style String 1
WBCS Style String 2
2. MBCS와 WBCS를 동시에 지원하기 위한 매크로
#define UNICODE
#define _UNICODE
MBCS와 WBCS를 동시에 수용하는 형태의 프로그램을 구현하기 위한 매크로 정의
#ifdef UNICODE //UNICODE 매크로가 선언되어 있다면
typedef WCHAR TCHAR;
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
#else //UNICODE 매크로가 선언되어있지 않다면
typedef CHAR TCHAR;
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
#endif
TCHAR arr[10];
다음과 같이 선언된 배열이 있다면
다음과 같이 선언된 배열이 있다면
#define UNICODE 라는 매크로를 명시하였다면
WCHAR arr[10], WBCS가 되는것이고, (= wchar_t arr[10])
메크로가 명시되어있지 않는다면
CHAR arr[10], MBCS가 되게 된다. (= char arr[10])
정리해보면 다음과 같다.
매크로 UNICODE가 정의되면...
TCHAR arr[10]; => WCHAR arr[10]; => wchar_t arr[10];
매크로 UNICODE가 정의되지 않으면...
TCHAR arr[10]; => CHAR arr[10]; => char arr[10];
(#include<tchar.h>에 선언된 내용)
#ifdef _UNICODE
#define __T(x) L ## x
_UNICODE 매크로가 선언되어있을때,
__T("ABC") 이라면 -> L"ABC" 이렇게 붙여주자는 뜻.
#else
#define __T(x) x
하지만 _UNICODE가 선언되어있지 않을때에는
__T("ABC") 는 "ABC" 이것과 같게됩니다.
#endif
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
_T(x) , __T(x) , _TEXT(x) 모두 같은의미 입니다. 특히 _T(x)를 많이 사용합니다.
_T("windows"); 라고 선언되어 있을때,
메크로가 있다면
L"windows" 로 WBCS 기반으로 저장되고,
메크로가 없다면
"windows" 로 저장된다.
ex)
/* MBCS_WBCS1.cpp */
3. MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 함수들
다음은 tchar.h에 선언되어 있는 함수 이름과 관련된 매크로이다.
활용빈도가 높은 일부 함수에 대해서 참고용으로....
/* MBCS_WBCS2.cpp */
}
출처. 윈도우즈 프로그래밍 | 윤성우 저 | 한빛미디어 ex)
/* MBCS_WBCS1.cpp */
#define UNICODE
#define _UNICODE
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
int wmain(void)
{
TCHAR str[] = _T("1234567");
int size = sizeof(str);
printf("string length : %d\n", size); // 출력결과 16
return 0;
}
실행 결과를 보게 되면 TCHAR str[] = _T("1234567")로 선언된 문자열이 유니코드로 처리되었음을 알 수 있다.
실행 결과를 보게 되면 TCHAR str[] = _T("1234567")로 선언된 문자열이 유니코드로 처리되었음을 알 수 있다.
3. MBCS와 WBCS(유니코드)를 동시에 지원하기 위한 함수들
다음은 tchar.h에 선언되어 있는 함수 이름과 관련된 매크로이다.
활용빈도가 높은 일부 함수에 대해서 참고용으로....
#ifdef _UNICODE
#define _tmain wmain
#define _tcslen wcslen
#define _tcscat wcscat
#define _tcscpy wcscpy
#define _tcsncpy wcsncpy
#define _tcscmp wcscmp
#define _tcsncmp wcsncmp
#define _tprintf wprintf
#define _tscanf wscanf
#define _fgetts fgetws
#define _fputts fputws
#else
#define _tmain main
#define _tcslen strlen
#define _tcscat strcat
#define _tcscpy strcpy
#define _tcsncpy strncpy
#define _tcscmp strcmp
#define _tcsncmp strncmp
#define _tprintf printf
#define _tscanf scanf
#define _fgetts fgets
#define _fputts fputs
#endif
/* MBCS_WBCS2.cpp */
#define UNICODE // WBCS지원 이줄과 다음줄을 주석처리하면 MBCS 지원
#define _UNICODE
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
int _tmain(int argc, TCHAR* argv[])
{
LPTSTR str1 = _T("MBCS or WBCS 1");
TCHAR str2[] = _T("MBCS or WBCS 2");
TCHAR str3[100];
TCHAR str4[50];
LPCTSTR pStr=str1;
_tprintf( _T("string size : %d\n"), sizeof(str2)); // 30
_tprintf( _T("string length : %d\n"), _tcslen(pStr)); // 14
_fputts(_T("Input String 1 : "), stdout);
_tscanf(_T("%s"), str3);
_fputts(_T("Input String 2 : "), stdout);
_tscanf(_T("%s"), str4);
_tcscat(str3, str4);
_tprintf(_T("String1 + String2 : %s\n"), str3);
return 0;
'Windows Programming > Windows::System' 카테고리의 다른 글
프로세스와 스케줄링 및 컨텍스트 스위칭 (0) | 2012.03.06 |
---|---|
명령 프롬프트(cmd) 만들기 (3) | 2012.03.02 |
오류의 확인(GetLastError 함수) (0) | 2012.03.02 |
64bit 기반 프로그래밍 (0) | 2012.03.02 |
아스키코드 vs 유니코드(01. Windows에서의 유니코드(UNICODE)) (0) | 2012.03.02 |
Comments