Search

Unicode Programming

[- Disclaimer -] 아래 내용은 정보보안 공부 목적으로 작성된 것이나, 이를 토대로 허가되지 않은 대상에 실습을 진행할 경우 해킹 시도로 간주하여 법적 처벌을 받을 수 있음을 알려 드립니다.
SBCS (=Single Byte Character Set)
✦ 기존 Programming 환경
✦ 한 문자 당 1 Byte
✦ 한글 지원 불가
DBCS (=Dobule Byte Character Set)
✦ SBCS 한계를 넓히는 목적이었으나 프로그램 상 많이 불편
✦ 한 문자 당 2 Byte
✦ SBCS 미호환, 한글 등 타언어 사용 가능
MBCS (=Multi Byte Character Set)
✦ 현재 우리나라 Programming 환경
✦ 영어 한 문자 당 1 Byte
✦ 한글 한 문자 당 2 Byte
✦ 현재 PC 사양이 높아 MBCS보다 WBCS를 사용해도 되며 Code 가독성/안전성 측면에서도 좋음
MBCS 문제점
✦ 실제 문자열 크기 추측 어려움
#include <stdio.h> #include <string.h> int main(void) { char str[] = "ABC현금"; int size = sizeof(str); int len = strlen(str); printf("배열 크기: %d\n", size); printf("문자열 크기: %d\n", len); }
Plain Text
복사
배열 크기: 8 문자열 크기: 7 -------------------------------- Process exited after 0.3674 seconds with return value 15 계속하려면 아무 키나 누르십시오 . . .
Plain Text
복사
WBCS (=Wide Byte Character Set)
✦ Unicode Programming 환경
✦ 한 문자 당 2 Byte
✦ 현재 PC 사양이 높아 MBCS보다 WBCS를 사용해도 되며 가독성/안전성 측면에서도 좋음
✦ Unicode를 지원하는 종류의 것들은 TCHAR 자료형의 문자열도 지원
WBCS에서 변경된 사항
✦ 자료형 변경
✧ char(1)에서 wchar_t(2)로
char <-> TCHAR char * <-> LPTSTR const char * <-> LPCTSTR
Plain Text
복사
✦ 문자열 표현 변경
✧ Ex) “ABC” 에서 L”ABC”로
wchar_t str[] = L”ABC”;
Plain Text
복사
✦ 프로그램 시작점 함수 변경
✧ main()에서 wmain()로
✦ Parameter의 자료형/문자열은 Unocide의 자료형/문자열
문자열 컨트롤
✦ SBCS 문자열 제어 관련 함수
✧ strlen(), strnlen(), strcpy(), strncpy(), strcat(), strncat(), strcmp(), strncmp()
✦ DBCS 문자열 제어 관련 함수
✧ lstrlen(), lstrcpy(), lstrcat(), lstrcmp() 등
✦ WBCS 문자열 제어 관련 함수
✧ wcslen(), wcsnlen(), wcscpy(), wcsncpy(), wcscat(), wcsncat(), wcscmp(). wcsncmp()
✦ SBCS 문자열 I/O 함수
✧ printf(), sprintf(), scanf(), fgets(), fputs()
✦ WBCS 문자열 I/O 함수
✧ wprintf(), wsprintf(), wscanf(), fgetws(), fputws()
✦ MBCS/WBCS 동시 지원
✧ 조건부 Compile
✧ <tchar.h>에 포함되어 있음
✧ UNICODE 매크로 정의/비정의 여부에 따라 MBCS/WBCS 동시 지원 사용 가능
// <Windows.h> (...) #ifdef UNICODE typedef wchar_t TCHAR; typedef LPWSTR LPTSTR; typedef LPCWSTR LPCTSTR; #else typedef char TCHAR; typedef LPSTR LPTSTR; typedef LPCSTR LPCTSTR; #endif (...)
Plain Text
복사
// <tchar.h> (...) #ifdef _UNICODE #define __T(x) L## x #else #define __T(x) x #define _T(x) __T(x) #define _TEXT(x) __T(x) (...)
Plain Text
복사
// <tchar.h> (...) #ifdef _UNICODE #define _tmain wmain #define _tcslen wmain #define _tprintf wmain #define _tscanf wmain #else #define _tmain wmain #define _tcslen wmain #define _tprintf wmain #define _tscanf wmain #endif (...)
Plain Text
복사
✦ MBCS/WBCS 동시 지원 - Ex)
LPTSTR str1 = _T("MBCS or WBCS 1"); TCHAR str2 = _T("MBCS or WBCS 2"); TCHAR str3[100]; TCHAR str4[50]; LPCTSTR pStr = strl; _tprintf(_T("string size: %d \n"), sizeof(str2)); _tprintf(_T("string length: %d \n"), _tcslen(pStr)); _fputs(_T("Input String 1:"), stdout); _tscanf(_T("%s"), str3);
Plain Text
복사
TEXT 매크로 사용
✦ Uniocde고 뭐고 유무 상관 없이 문자열 처리
TCHAR *str = "aapsemiordoenus";
Plain Text
복사
TCHAR *str = TEXT("aapsemiordoenus");
Plain Text
복사