본문 바로가기

Development/C++

wchar_t

2바이트 이상의 문자를 문자를 저장하기 위해 wchar_t 변수를 사용한다.
물론 char * 로 저장할수도 있다.

wchar_t 는 typedef unsigned long (리눅스) 혹은 short(윈도우) 형이다.

리눅스에서는 4바이트이고 윈도우에서는 2바이트이다.

왜 wchar_t 를 사용하는가?

만약 char * 형으로 문자열(UTF-8 방식)을 저장한다고 하면,
"가" 란 글자는 EA B0 80 (16진수) 형태로 저장된다.
즉,
char *pHangul = "가"; 라고 선언하면,
pHangul[0] -> 0xEA;
pHangul[1] -> 0xB0;
pHangul[2] -> 0x80;

가 저장된다.

이 상태에서 만약 알파벳과 한글을 혼용하면, 영어는 1바이트 한글은 3바이트 이므로, 한글과 영어를 구분하여 사용하기가 상당히 난해한 상황이 온다.
일일이 최상위 비트를 검사해서 '1' 인지 확인한후 '1' 이면 뒤에 2바이트를 더 읽어들이는 작업을 해야 한다.
잘못 계산하면 3바이트중 엉뚱한 곳부터 시작하게 되면 엉뚱한 결과가 나오게 된다.

wchar_t 를 사용하면 한글과 영어에 상관없이 wchar_t 하나당 하나의 문자가 저장된다.
예를 들어 wchar_t *pw = L"ab가나"; 라고 하면 
pw[0] -> 'a';
pw[1] -> 'b';
pw[2] -> '가';
pw[3] -> '나';

이런식으로 저장이 된다. 그러므로 굳이 최상위 비트를 비교하지 않아도 된다.

char * 이런식으로 저장되는 형식을 Multi Byte String 이라고 하며
wchar_t 에 저장되는 형식을 Wide Character String 이라고 한다.

wchar_t 사용하기

wchar_t 는 일반적으로 유니코드 형식으로 저장된다.
문자열을 대입하기 위해서는 접두어 "L" 을 붙여준다.

wchar_t *str = L"한글";

이런식으로 사용한다.

wchar_t 를 다루는 표준함수가 있다.

기본적으로 C 의 char * 문자 관리 함수와 같다. 대신 str 대신 wcs 를 적어주면 된다.
strlen -> wcslen
strcpy -> wcscpy
...

wchar_t 를 출력하기위해서는 wprintf 또는 fputws 함수를 사용하면 된다.

리눅스에서는 wprintf 를 사용하면 printf 와 같이 사용할 수 없다.

wchar_t 와 char 변환

만약 소켓통신을 한다고 할때,
테이터를 wchar_t 로 받는 것보다 char * 로 받아서 형변환을 해주는게 손쉬울 것이다.
데이터를 전송할때도 wchar_t 를 char * 로 바꿔서 전송해주는것이 호환성을 위해 좋을 것이다.
(프로그램간에 프로토콜이 정해져 있으면, wchar_t 든 char 든 크게 상관은 없다.)

 

 

 

 

출처 : waintman.tistory.com/33

 

wchar_t

2바이트 이상의 문자를 문자를 저장하기 위해 wchar_t 변수를 사용한다. 물론 char * 로 저장할수도 있다. wchar_t 는 typedef unsigned long (리눅스) 혹은 short(윈도우) 형이다. 리눅스에서는 4바이트이고 ��

waintman.tistory.com

 

'Development > C++' 카테고리의 다른 글

UTF-8 string to wstring  (0) 2020.09.18
wstring to UTF-8 string  (0) 2020.09.17
[C++17] filesystem - String 형변환  (0) 2020.09.17
string c_str()함수  (0) 2020.09.17
Good Explanation about Inline Function in C++  (0) 2020.09.06