[System Programming] 2장 아스키코드 vs 유니코드

Windows 에서의 유니코드(UNICODE)

문자셋의 종류와 특성

  • 아스키코드 (ASCII CODE) : 미국에서 정의하는 표준. 1바이트로 표현. 한글와 같은 다른언어를 표현하는데 쓰기 어려움.
  • 유니코드 (UNICODE) : 2바이트로 표현되기 때문에 한글을 충분히 표현 가능 alt text

유니코드를 전부 쓰면 편하다. 하지만 옛날 시스템, OS는 여전히 MBSC, WBSC 방식을 사용하는 곳이 존재한다.

MBCS 기반의 문자열

#include "stdio.h"
#include "string.h"

int main()
{
    char str[] = "ABC한글";
    int size = sizeof(str);
    int len =-strlen(str);

    printf("array size  : %d \n" , size );
    printf("str size  : %d \n", len);

    return 0;
}
array size  : 8
str size  : 7

한글은 2바이트로 처리되고 있다. 이 결과는 mbsc를 기반으로 실행됨을 보여준다.

하지만 ABC (길이 3) 한글 (길이 4) = 7 의 결과를 보면 한글이라는 단어가 4로 인식되고 있다. 이게 mbsc의 문제점이다.

이는 WBSC 방식을 사용하여 모든 문자를 2바이트로 처리함으로써 문제점을 해결할 수 있게 된다.

WBCS 기반의 프로그래밍

wbsc방식으로 프로그래밍하기 위해선 신경써야할 일이 있다.

char을 대신하는 wchar_t char은 1바이트 메모리만 할당, wchar_t는 2바이트 메모리공간에 할당된다.

"ABC" 를 대신하는 L"ABC"

wchar_t str [] = L"ABC";

strlen을 대신하는 wcslen

#include <stdio.h>
#include <string.h>

int main() {
	wchar_t str[] = L"ABC";
	int size = sizeof(str);
	int len = strlen(str);

	printf("배열의 크기: %d \n", size);
	printf("문자열 길이: %d \n", len);

	return 0;
}

strlen()에서 컴파일 에러가 발생한다. 그 이유는 무엇일까? str은 유니코드 기반이기 때문에 SBSC 기반의 함수인 strlen은 처리하지 못하기 때문이다.

수정된 예제

#include <stdio.h>
#include <string.h>

int main() {
	wchar_t str[] = L"ABC";
	int size = sizeof(str);
	int len = wcslen(str);

	printf("배열의 크기: %d \n", size);
	printf("문자열 길이: %d \n", len);

	return 0;
}
배열의 크기: 8
문자열 길이: 3

유니코드 방식의 char이니 각 2바이트씩 null문자까지하면 총 8바이트이다.

WBSC기반 문자열 조작 함수 (참고)

alt text

wmain 함수에 대한 이해

#include <stdio.h>

int main(int argc, char* argv[]) {
	int i;
	for (i = 0; i < argc; i++)
	{
		fputws(argv[i], stdout);
	}
	return 0;
}

이 코드를 실행하면 컴파일에러가 발생한다.

WBSC기반 fputws을 사용한건 좋았지만 출력이 되는 문자열이 유니코드 기반이 아니란 점이다.

main 함수는 전달되는 문자열을 MBSC 기반으로 구성하기 때문에 제대로 실행될 수 없다.

이제 매개변수 문자열을 유니코드 기반으로 구성하기 위한 wmain을 살펴보자. alt text wmain 함수로 시작되는 프로그램은 실행 시 전달되는 문자열을 유니코드 기반으로 구성한다는 것이다.

아래는 완전한 유니코드 기반으로 코드를 재구성한 것이다.

#include <stdio.h>

int wmain(int argc, wchar_t* argv[]) {
	int i;
	for (i = 0; i < argc; i++)
	{
		fputws(argv[i], stdout);
		fputws(L"\n", stdout);
	}
	return 0;
}
>cpp.exe AAA BBB CCC

cpp.exe
AAA
BBB
CCC

MBCS 와 WBCS 의 동시 지원

MBCS 와 WBCS (유니코드)를 동시에 지원하기 위한 매크로

alt text

MBCS 와 WBCS (유니코드)를 동시에 지원하기 위한 함수들

alt text

그리고 UTF-8

가장 널리 사용되는 유니코드 인코딩 방식

  • MBSC와 SBSC 방식의 특징을 둘다 가지고 있다

가변 길이 인코딩 방식이며, 문자를 1바이트에서 4바이트로 인코딩 한다.

  • ASCII와 완벽히 호환된다. 1바이트로 표현될때 ASCII와 코드 포인트가 동일 하기에 기존의 아스키 기반 시스템에서 문제가 발생하지 않는다.

출처

윤성우, ⌜뇌를 자극하는 윈도우즈 시스템 프로그래밍⌟, 한빛미디어, 2006
유튜브, "한빛미디어", "뇌를 자극하는 윈도우즈 시스템 프로그래밍", https://www.youtube.com/watch?v=GVX-m3RF-K0&list=PLVsNizTWUw7E2KrfnsyEjTqo-6uKiQoxc Github, "system_programming", https://github.com/connieya/system_programming