확장 문자 형식 wchar_t와 한글 문자 [언제나 C언어]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의는 확장 문자 형식 wchar_t와 한글 문자 표현을 다룰거예요.

1. char 형식의 한계
2. wchar_t 형식
3. wchar_t 형식 크기 및 출력 함수

1. char 형식의 한계

이전 강의에서 char 형식은 ASCII 코드를 표현할 수 있는 문자 형식이라고 했었죠.

영문 알파벳이 아닌 한글처럼 ASCII 코드가 아닌 문자는 char 형식으로 표현하는데 한계가 있어요.

한글 문자 하나를 char 형식으로 다루지 못하는 것이죠.

#include <stdio.h> //표준 입출력 헤더
int main()
{   
    char ch = 'ㄱ';
    printf("%c\n", ch);
    return 0;
}

위 코드의 실행 결과는 다음과 같습니다.

?

이처럼 엉뚱한 결과를 출력하는 것을 알 수 있어요.

1바이트 크기인 char 형식으로는 한글에 있는 모든 문자를 표현하지 못하는 것이죠.

2. wchar_t 형식

C언어 표준은 초기에 미국 ANSI 기구에서 제시했어요.

ISO에서는 C99 표준(1999년)을 제시하였고 2005년에 ANSI에서도 이를 표준으로 채택했습니다.

2011년에는 ISO에서 C11을 제시했어요.

ISO에서는 각 지역에 맞는 언어를 사용할 수 있게 wchar_t 문자 형식을 제공하길 권고하였습니다.

wchar_t 형식 문자를 표현할 때는 대문자 L과 함께 문자 표현을 사용합니다. (예: L’홍’)

wchar_t 형식 문자열을 표현할 때도 대문자 L과 함께 문자열을 표현합니다. (예: L”홍길동”)

포멧에 맞게 출력하는 함수로 wprintf 함수를 이용하여 출력해 봅시다.

#include <stdio.h>//표준 입출력 헤더
int main()
{   
    wchar_t ch = L'ㄱ';
    wprintf(L"%c\n", ch);
    return 0;
}

하지만 출력 결과를 보면 기대한 것과 다릅니다.

?

자신이 사용하는 문자가 무엇인지 로케일을 지정해 주어야 합니다.

이 때 locale.h 파일을 포함하고 setlocale 함수를 호출하여 지역을 지정해 주어야 합니다.

setlocale 함수는 첫 번째 인자로 지역 문자를 어디까지 사용할 것인지 범위를 지정할 수 있습니다.

여기에서는 LC_ALL을 사용하여 전체 영역에 사용하도록 할게요.

#include <stdio.h>//표준 입출력 헤더
#include <locale.h>
int main()
{   
    wchar_t ch = L'ㄱ';
    setlocale(LC_ALL, "KOREAN");
    wprintf(L"%c\n", ch);
    return 0;
}

이제 실행해 보면 원하는 결과를 얻을 수 있어요.

3. wchar_t 형식 크기 및 출력 함수

먼저 wchar_t 형식의 크기를 알아봅시다.

#include <stdio.h>//표준 입출력 헤더
#include <locale.h>
int main()
{   
    printf("sizeof(wchar_t):%d bytes\n",sizeof(wchar_t));
    return 0;
}

실행 결과를 보면 2바이트인 것을 알 수 있어요.

sizeof(wchar_t):4 bytes

wchar_t 문자 한 개를 출력하는 함수 putwchar 함수를 제공합니다.

개행을 포함하여 wchar_t 문자열을 출력하는 함수 _wputs 함수도 제공합니다.

포멧에 맞게 wchar_t 문자열을 출력하는 함수는 이미 앞에서 wprintf 함수를 보았죠.

이 외에도 다양한 함수에서 wchar_t 형식을 취급하고 있어요.

#include <stdlib.h>//표준 라이브러리 헤더
#include <stdio.h>//표준 입출력 헤더
#include <locale.h>
int main()
{   
    wchar_t ch = L'ㄱ';
    setlocale(LC_ALL, "KOREAN");
    wprintf(L"%c\n", ch);
    printf("%d\n", sizeof(wchar_t));
    putwchar(L'홍');
    putwchar(L'\n');
    _putws(L"홍길동");
    return 0;
}

실행 결과는 다음과 같습니다.

ㄱ
2
홍
홍길동