Win32 - UNICODE vs ASCII

[TOC]

ASCII

Unicode

인코딩 종류

octet

문자셋

약속된 문자의 표현방법

Visual Studio에서 문자셋 설정

MBCS 문제

WBCS

WBCS 방식은 모든 문자를 2바이트로 처리하기 때문에 MBCS 방식의 문제점이 나타나지 않고 MBCS 보다 빠르다.

sizeof

sizeof는 함수가 아니라 연산자인다.

Windows 자료형 조합원리

Windows 자료형 예

문자열 관련 함수

SBCS WBCS  
printf int wprintf(const wchar_t* format [, argument…]); Print formatted data to stdout
scanf int wscanf(wchar_t* format [, argument…]); Read formatted data from stdin
fgets wscanf* fgetws(wchar_t* string, int n, FILE* stream); Get string from stream
fputs int fputws(const wchar_t* string, FILE* stream); Write string to stream

문자열 관련 함수에서 한글사용 시

#include "locale.h"

_wsetlocale(LC_ALL, L"korean");

Windows2000 이상에서는 내부적으로 모든 문자열을 유니코드 기반으로 처리하므로 MBCS 방식으로 코드를 작성했다면 내부적으로 2바이트 유니코드 형식으로 변환하므로 프로그램 성능에 다소 영향을 미칠 수 있다.

main 함수를 유니코드 기반으로 작성하기

int wmain(int argc, wchar_t* argv[]);

int _tmain(int argc, _TCHAR* argv[]);

MBCS와 WBCS를 동시에 지원하는 매크로 T~

// tchar.h

#ifdef UNICODE
	typedef WCHAR		TCHAR;
	typedef LPWCHAR		LPTSTR;
	typedef LPCWCHAR	LPCTSTR;
#else
	typedef CHAR		TCHAR;
	typedef LPCHAR		LPTSTR;
	typedef LPCCHAR		LPCTSTR;
#endif

#ifdef _UNICODE
	#define __T(x)	L ## x
#else
	#define __T(x)	x
#endif

#define _T(x)		__T(x)
#define _TEXT(x)	__T(x)

UNICODE 매크로와 관련된 함수

T(template) WBCS MBCS
_tmain wmain main
_tcslen wcslen strlen
_tcscat wcscat strcat
_tcscpy wcscpy strcpy
_tcsncpy wcsncpy strncpy
_tcscmp wcscmp strcmp
_tcsncmp wcsncmp strncmp
_tprintf wprintf printf
_tscanf wscanf scanf
_fgetts fgetws fgets
_fputts fputws fputs

Pre-compiled 헤더

TCHAR 조작 함수 찾는 방법

TCHAR에서 int를 string으로 변경하기

const UINT strLength = 10;
TCHAR strBuffer[strLength];
_stprintf_s(strBuffer, strLength, "%d", 99); // 뒤에 _s가 붙은 함수가 보안이 강화된 버전.

참고