아스키코드 & 유니코드
문자의 표현방법
아스키코드는 1바이트임. 알파뱃+확장문자 해도 256개가 넘지 않으니까.
그런데 이러면 다른 영어가 아닌 언어들은 '곤란' 그래서 유니코드는 2바이트를 씀. 이러면 65536개 표현 가능.
문자셋에 대해 알아보자. 문자셋은 약속된 문자의 표현방법을 의미한다. SBCS, MBCS, WBCS로 나눌 수 있다.
- SBCS(Single Byte Character Set) : 모든 문자를 1바이트로 표현한다. 아스키코드가 대표적
- WBCS(Wide Byte Character Set) : 모든 문자를 2바이트로 표현한다. 유니코드가 대표적이다.
- MBCS(Multi Byte Character Set) : 모든 문자를 '여러 바이트' 즉 어떤 문자는 1바이트로 어떤 문자는 2바이트로 표현하는 식이다. 이 방식에 따르면 한글은 2바이트로 처리되지만 영어는 1바이트로 처리된다. 모든 문자를 2바이트로 처리하는 WBCS보다 효율적이라는 느낌을 받을 수 있으나 프로그램 구현에 주의를 기울여야 한다.
.
MBCS
흔히 쓰는 strlen함수나 char타입은 MBCS형식이다.
int main()
{
char str[] = "운명의Destiny"; //10글자
printf("문자열 사이즈 : %d\n", sizeof(str));
printf("문자열 길이 : %d", strlen(str));
return 0;
}
"운명의Destiny"의 문자열 사이즈와 길이는 다음과 같다.
한글은 2바이트, 영어는 1바이트, 마지막 NULL문자 1바이트까지 하면 총 14바이트가 나온다.
그런데 길이는 13으로 나온다. 한글을 2글자로 쳐서 그렇다. 이처럼 strlen함수는 한글과 호환이 안 되는 걸 볼 수 있다.
.
WBCS
이번에는 WBCS기반의 문자열 셋을 사용해보자. char대신 wchat_t를 쓰며, 리터럴 앞에 L을 붙여준다. strlen대신에는 wcslen을 쓴다.
int main()
{
wchar_t str[] = L"운명의Destiny"; //10글자
printf("문자열 사이즈 : %d\n", sizeof(str));
printf("문자열 길이 : %d", wcslen(str));
return 0;
}
모든 문자가 2바이트로 취급되었음을 알 수 있다. 심지어 NULL문자도 2바이트로 취급됐다. 문자열 길이도 정상적으로 출력된다.
근데 윈도우 2000 이상의 운영체제에서는 기본적으로 유니코드를 지원할 뿐 아니라, 내부적으로 모든 문자열을 유니코드 기반으로 처리한다.
따라서 MBCS기반의
printf("운명의Destiny");
를 호출해도 운영체제 내부에서는 전달되는 문자열을 2바이트 유니코드로 변환한다. 그리고 이는 성능에 영향을 미칠 수 있다.
만약 그냥 애초에 유니코드 기반으로 프로그램을 작성했다면 오버헤드가 없을 것이다.
wprintf(L"운명의Destiny");
위와 같이 말이다.
이렇게 유니코드 기반의 함수들이 있다. wmain()도 있다. (인자로 넘겨받는 문자열이 WBCS 형식 사용)
따라서 WBCS기반 (유니코드)로 프로그래밍을 하는 것이 성능적으로 좋다. 그러나 시스템에 따라서 유니코드를 지원하지 않을 수도 있기 때문이 이를 고려해서 프로그래밍을 해야한다는 단점이 있다. 이런 상황에서는 전처리기를 지용하여 자료형 타입을 바꿔주는 식으로 처리할 수 있다.