[Chapter 2] Unicode

운영체제/Windows via c++

2020. 7. 3. 21:04

1. 유니코드를 사용하는 이유

 

 (1) 유니코드를 사용하면 다른 나라의 언어로 애플리케이션을 지역화하기가 쉽다.

 (2) 유니코드를 사용하면 코드가 더 빠르게 수행되며 더 작은 메모리를 사용하기 때문에

     애플리케이션의 효율성이 증대된다.

 (3) 유니코드를 사용하면 윈도우가 제공하는 모든 함수를 쉽게 사용할 수 있다.

 

2. 문자열 작업에 대한 권고사항

 

 (1) 문자열을 char 타입이나 byte 배열로 생각하지 말고, 문자의 배열로 생각하라.

 (2) 문자나 문자열을 나타낼 때 중립 자료형(TCHAR/PTSTR과 같은)을 사용하라.

 (3) 문자나 문자열 상수 값을 표현할 때에는 TEXT나 _T 매크로를 사용하라.

 (4) 보통의 함수들은 버퍼의 크기를 전달해야 할 때 바이트 단위가 아닌 문자 단위로 값을

     전달한다. 그렇기 때문에 sizeof(szBuffer)를 사용하는 대신 _countof(szBuffer)를 사용해야

     한다.

 (5) 항상 이름이 _s로 끝나는 안전 문자열 함수를 이용해라.

 

3. 유니코드 <-> ANSI 문자열 사이의 변경

int MultiByteToWideChar(
	UINT uCodePage,
	DWORD dwFlags,
	PCSTR pMultiByteStr,
	int cbMultiByte,
	PWSTR pWideCharStr,
	int cchWideChar);

uCodePage : 멀티바이트 문자열과 관련된 코드 페이지를 지정한다. (CP_ACP를 쓰면 현재 운영체제에 지정된 언어로 인식한다.)

 

dwFlags : 악센트 기호와 같은 발음을 위한 특수기호에 대한 추가적인 제어 (일반적으로 0으로 둔다.)

 

pMultiByteStr : 변경할 문자열 

 

cbMultiByte : 변경할 문자열의 길이

 

pWideCharStr : 유니코드로 변경된 문자를 저장하기위한 메모리 버퍼의 주소

 

cchWideChar : 버퍼의 최대 크기 (0을 지정해주어 이 함수를 호출하면 이 함수는 변경을 수행하는 대신 변경에 필요한 버퍼의 크기를 문자단위로 반환해 준다.) -> 변환될 유니코드 문자열의 크기를 받아올 수 있다.

 

int WideCharToMultiByte(
	UINT uCodePage,
	DWORD dwFlags,
	PCWSTR pWideCharStr,
	int cchWideChar,
	PSTR pMultiByteStr,
	int cbMultiByte,
	PCSTR pDefaultChar,
	PBOOL pfUsedDefaultChar
)

pDefaultChar, pfUsedDefaultChar을 제외하고는 위의 함수와 들어갈 매개변수가 같다.

 

pDefaultChar : 지정된 코드 페이지 내에 적절한 문자가 존재하지 않을 경우 default로 결정되는 값을 입력한다

(NULL로 지정되면 ?를 반환하는데 물음표가 와일드카드 문자로 사용되는 경우 매우 위험하다.)

 

pfUsedDefaultChar : 변경할 와이드-문자 문자열 중 한 자라도 멀티바이트-문자 문자열로 변경하는 것이 실패하는경우 TRUE가 반환된다. 모든 문자열에 대해 변경이 성공적이면 FALSE를 반환한다.

 

사용 예

 

// Unicode -> MultiByte
wchar_t strUnicode[256] = {0,}; 
char strMultibyte[256] = {0,}; 
wcscpy_s(strUnicode,256,L"유니코드"); 
int len = WideCharToMultiByte( CP_ACP, 0, strUnicode, -1, NULL, 0, NULL, NULL );	
WideCharToMultiByte( CP_ACP, 0, strUnicode, -1, strMultibyte, len, NULL, NULL );


// MultiByte -> Unicode
wchar_t strUnicode[256] = {0,}; 
char strMultibyte[256] = {0,}; 
strcpy_s(strMultibyte,256,"멀티바이트"); 
int nLen = MultiByteToWideChar(CP_ACP, 0, strMultibyte, strlen(strMultibyte), NULL, NULL); 
MultiByteToWideChar(CP_ACP, 0, strMultibyte, strlen(strMultibyte), strUnicode, nLen);

소스 코드 출처 :  https://armful-log.tistory.com/5

 

[C++] MultiByteToWideChar, WideCharToMultiByte 함수

MBCS ( MultiByteCharacterSet ) - 다양한 Byte 수를 사용(1Byte + 2Byte) - 아스키코드 WBCS ( WideByteCharacterSet ) - 2Byte만 사용 - 유니코드 일반 유니코드 : 모든 글자를 2byte로 표현 utf-8 유니코드 :..

armful-log.tistory.com