윈도우에서의 유니코드
4. 문자 표현 (기초프로그래밍 복습) 4.1 아스키 코드 ASCII 코드(American Standard Code for Information Interchange) 미국표준협회(ANSI)가 제정한 데이터처리 및 통신 표준 코드 표현할 수 있는 문자는 128(27)개 확장 아스키 코드: 7비트로는 다양한 문자를 표현하기 어려워 8비트로 확장
4. 문자 표현 (기초프로그래밍 복습) 4.2 유니코드 전 세계의 언어를 일관된 방법으로 표현하고 다룰 수 있는 국제적인 문자 코드 규약 문자 하나를 2바이트 이상으로 표현, 65,536(216)개 이상의 문자와 기호를 나타냄 인코딩 방식은 UTF-8, UTF-16, UTF-32
문자셋의 종류와 특성 SBCS(Single Byte Character Set) 문자를 표현하는데 1바이트 사용 아스키 코드 MBCS(Multi Byte Character Set) 한글은 2바이트, 영문은 1바이트 사용 WBCS(Wide Byte Character Set) 문자를 표현하는데 2바이트 이상 사용 유니코드
MBCS 예제 #include <stdio.h> #include <string.h> int main() { char str[] = "ABC한글"; int size = sizeof(str); int len = strlen(str); printf("배열 크기 : %d \n", size); printf("문자열 길이 : %d \n", len); } 배열 크기 : 8 문자열 길이 : 7 실행결과
WBCS 기반의 프로그래밍 WBCS를 위한 두가지 WBCS 기반 문자열 선언 예 첫째: char를 대신하는 wchar_t 둘째: “ABC”를 대신하는 L“ABC” WBCS 기반 문자열 선언 예 wchar_t str[] = L“ABC”;
문자열 조작함수 SBCS 함수 WBCS 기반의 문자열 조작 함수 strlen size_t wcslen (const wchar_t* string); strcpy wchar_t* wcscpy (wchar_t* dest, const wchar_t* src); strncpy wchar_t* wcsncpy (wchar_t* dest, const wchar_t* src, size_t cnt); strcat wchar_t* wcscat (wchar_t* dest, const wchar_t* src); strncat wchar_t* wcsncat (wchar_t* dest, const wchar_t* src, size_t cnt); strcmp int wcscmp (const wchar_t* s1, const wchar_t* s2); strncmp int wcsncmp (const wchar_t* s1, const wchar_t* s2, size_t cnt);
문자열 입출력 함수 SBCS 함수 WBCS 기반의 문자열 입출력 함수 printf int wprintf (const wchar_t* format [, argument]...); scanf int wscanf (const wchar_t* format [,argument]...); fgets wchar_t* fgetws (wchar_t* string, int n, FILE* stream); fputs int fputws (const wchar_t* string, FILE* stream);
WBCS 예제 #include <stdio.h> #include <string.h> int wmain(void) { wchar_t str[] = L"ABC"; int size = sizeof(str); int len = wcslen(str); wprintf(L"배열 크기 : %d \n", size); wprintf(L"문자열 길이 : %d \n", len); } 배열 크기 : 8 문자열 길이 : 3 실행결과
헤더파일 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;
SBCS와 WBCS 예제 #include <stdio.h> #include <windows.h> int wmain() { LPSTR str1 = "SBCS String"; LPWSTR str2 = L"WBCS String"; CHAR arr1[] = "SBCS String"; WCHAR arr2[] = L"WBCS String"; printf("%s\n", str1); printf("%s\n", arr1); wprintf("%s\n", str2); wprintf("%s\n", arr2); }
MBCS와 WBCS 동시 지원 매크로 #ifdef UNICODE typedef WCHAR TCHAR; typedef LPWSTR LPTSTR; typedef LPCWSTR LPCTSTR; #else typedef CHAR TCHAR; typedef LPSTR LPTSTR; typedef LPCSTR LPCTSTR; #endif
MBCS와 WBCS 동시 지원 매크로 #ifdef UNICODE #define __T(x) L ## x #else #define __T(x) x #endif #define _T(x) __T(x) #define _TEXT(x) __T(x)
MBCS와 WBCS 동시 지원 함수 #ifdef UNICODE #define _tmain wmain #define _tcslen wcslen #define _tprintf wprintf #define _tscanf wscanf #else #define _tmain main #define _tcslen strlen #define _tprintf printf #define _tscanf scanf #endif
MBCS와 WBCS 동시 지원 예제 #define UNICODE #define _UNICODE #include <stdio.h> #include <tchar.h> #include <windows.h> int _tmain() { LPTSTR str1 = _T("MBCS or WBCS String"); TCHAR arr1[100]; _tprintf(_T("string size: %d\n"), sizeof(str1)); _tscanf(_T("입력: %s"), arr1); _tprintf(_T("출력: %s\n"), arr1); }