윈도우에서 유니코드
문자셋의 종류와 특성
-
SBCS ( Single Byte Character Set )
1byte 로 문자를 표현. example : ASCII Code -
MBCS ( Multy Byte Character Set )
한글은 2, 영어는 1 byte로 문자를 표현. -
WBCS ( Wide Byte Character Set )
2byte 로 문자를 표현. example : UNICODE
#include<stdio.h>
#include<string.h>
int main(void){
char str[]="ABC한글";
printf("%d\n%d\n", sizeof(str), strlen(str));
return 0;
}
실행결과
10
9
sizeof 연산자는 NULL 문자를 포함하기 때문에 ,길이가 1 늘어납니다.
영어는 1 byte 를 차지하고, 한글은 3 byte 를 차지해 영어*3 + 한글(3)*2 = 9byte 가 되는걸 볼 수 있다.
CP949, EUC-KR 인코딩 방식은 한글을 2byte 로 저장하고,
UTF-8 인코딩 방식은 한글을 3byte 로 저장합니다.
저는 UTF-8 인코딩 방식을 사용하는 visual code 에서 실행했으니 한글이 3byte, 영어가 1byte 로 나왔습니다.
이렇게 c언어에서 프로그램을 실행함으로써, MBSC 를 사용하고 있다는걸 알 수 있습니다.
WBSC 기반 프로그래밍
char 대신 wchar_t 사용. "ABC" 대신 L"ABC" 사용.
example : wchar_t str[]=L"ABC";
strlen 함수의 원형은 size_t strlen(const char* str) 이다. 따라서 wchar_t 로 선언된 문자열의 길이는 strlen() 함수로 구할 수 없다. WBSC 기반의 함수들이 따로 준비되어있다.
wchar.h 헤더파일에 선언된 함수들이다. string.h 헤더파일에 선언된 SBSC기반 함수들과 비교해 나열해보겠다.
- strlen -> wcslen
- strcpy -> wcscpy
- strncpy -> wcsncpy
- strcat -> wcscat
- strncat -> wcsncat
- strcmp -> wcscmp
- strncmp -> wcsncmp
stdio.h 에는 WBSC 기반의 문자열 입출력함수 또한 선언되어있다.
- printf -> wprintf
- scanf -> wscanf
- fgets -> fgetws
- fputs -> fputws
매개변수 전달인자 유니코드화
c:> test.exe AAA BBB
main 일경우
"test.exe", "AAA", "BBB"
-> int main(int argc, char* argv[])
wmain 일경우
L"test.exe", L"AAA", L"BBB"
-> int wmain(int argc, wchar_t* argv[])
매개변수가 SBSC, WBSC 으로 각각 main, wmain 에 다르게 들어가는걸 볼 수 있다.
#윤성우 윈도우 시스템 프로그래밍을 BASE로 제작되었습니다.