본문 바로가기
Program

[Programming] (윈도우 시스템 프로그래밍) 윈도우에서 유니코드

by snwo 2020. 8. 6.

윈도우에서 유니코드

문자셋의 종류와 특성

  • 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로 제작되었습니다.