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 든 크게 상관은 없다.)
'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 |