[C] C언어 유니코드 사용법

언어/C 2018. 12. 17. 06:25

c언어는 기본적으로 유니코드가 아닌 아스키코드를 사용하기 때문에 한글 같은 문자들을 사용하려면 약간의 번거로움이 따른다.


여기서 말하는 아스키 코드라는 건 미국에서 알파벳이나 기본적인 문장부호들을 컴퓨터에서 표현하려고 각각의 수를 문자에 대응시켜놓은 표준 체계인데, 이 체계는 1바이트 = 8비트 -> 2의 8제곱=256만큼의 수만을 갖기 때문에 로마자와 몇개의 기호만을 포함하기 때문에 한글이나 한자, 가나 등의 다른 문자를 표현할 수 없다.

그에 반해 유니코드를 포함한 기타 확장문자 체계들은 2바이트=16비트로 16제곱=65536개의 수를 표현할 수 있어 주로 사용되는 대부분의 언어를 지원하고도 공간이 남는다.


비교적 뒤에 제작된 JAVA는 기본적으로 자료형 char를 2바이트로 설정해놓아서 알아서 2바이트 기준의 확장문자들을 사용하는데, c언어는 1바이트로 되어있어 char형 두개씩을 배열로 묶어 멀티바이트 형식으로 표현하거나 2바이트 이상의 정수 타입들을 사용하는 수밖에 없다.

유니코드 입출력을 표현하려면 일단 컴파일러 내에서 유니코드를 사용하게끔 적용해야 한다.

비쥬얼의 경우에는 프로젝트->문자열 체크 속성 에서 유니코드 집합 사용을 체크하면 된다.

이런걸 wide character(확장문자)라고 하는데 이것에 대한 함수를 지원하는 라이브러리가 바로 <wchar.h>이다.

http://www.cplusplus.com/reference/cwchar/


​복잡하게 생각할건 없고 그냥 stdio나 stdlib에 있는 통상 함수들 이름 앞에 w를 붙이면 대부분 해당 함수의 확장문자 버전이 된다. 

그리고 유니코드 문자열을 위한 자료형으로서 wchar_t가 정의되어 있는데 대체로는 unsigned short와 같다. 근데 이게 표준으로 명확하게 명시된게 아니라서 int일 경우도 있다. 그냥 char라는 정수타입을 함수 내에서 문자를 처리하는 타입이라 약속해놓고 쓰는것처럼, w계열 함수들도 wchar_t를 문자 타입으로 약속해놓고 쓰는 것이다.

그리고 리터럴을 2바이트 문자열로 인식하게 해주는 접두어 L이 있다. c언어는 기본적으로 1바이트 형식으로 문자열을 인식하고, 리터럴마저도 그런 법칙에서 벗어나진 않기 때문에 이걸 앞에 붙여주지 않으면 문제가 생긴다.



그리고 필요한게 이것뿐만이 아니다.

로케일이란게 필요하다. 문자열 처리방식을 어떻게 해야 할까를 정하는 것이다.

C언어의 로케일은 기본적으로 아스키코드만을 사용하기 때문에 이것도 확장을 해줘야 제대로 처리를 한다.

http://www.cplusplus.com/reference/clocale/setlocale/


여태껏 나열한 것을 바탕으로 출력 예제를 작성하면 다음과 같이 할 수 있다.


구글링하면 훨씬  더 좋은 글들이 많다.


2017/2/2 작성

2018/7/22 수정 

'언어 > C' 카테고리의 다른 글

[C] Q: 프로그램이 실행되자마자 꺼져요!  (0) 2018.12.30
[C] 함수 호출 규약.link  (0) 2018.12.17
[C] 쇼트 서킷으로 조건문 구현  (0) 2018.12.17
[C] sizeof 연산자에 대해서  (0) 2018.12.17
[C] 포인터란?  (0) 2018.12.17

설정

트랙백

댓글