CAFE

C 프로그래밍

ASCII CODE 128 ~ 255 에는 무엇이 있는가?

작성자별은빛나고|작성시간12.05.19|조회수4,560 목록 댓글 0

키보드로 입력할 수 없는 글자는 어떻게 화면에 나타낼 수 있을까요?

 

이 프로그램을 실행하면 아래와 같이 나옵니다. 

실행결과를 보시면 영문키보드로는 입력이 불가능한 불어에서만 사용하는 특수한 글자들, 악상 따기, 악상 그라브 등은 물론, 독어에서 사용하는 움라우트(128 ~ 154),또는 키보드로 입력할 수 없는 통화기호들(155 ~ 157)등도 printf("%c" , i);로 화면에 표시할 수 있습니다. 로마자도 물론 쓸 수 있습니다. 또한 도표도 그릴 수 있습니다. 도스 시절 영문모드 화면에 서식을 그릴 때는 바로 저 코드(179 ~ 218)를 조합하여 칸을 그렸습니다.

 

그런데, 한글은 어떻게 쓸 수 있을까요? 

 위 코드를 실행하면

 

이와 같은 화면을 얻을 수 있습니다. 보이는 글자가 있죠? 한자도 보이네요. 어, 그런데 이상하네요. 첫 화면에서는 같은 값인데 한글이 안 나왔어요. 지금은 한글이 나오네요. 이것은 한글 드라이버를 설치했기 때문입니다. 첫 화면에서는 한글드라이브를 취소한 것이고요. 즉, 한글을 쓰기 위해 한글 드라이브를 설치하면 128 이후의 코드는 애초에 지정된 ASCII코드를 무시하고 한글 코드로 재정의 되는 것입니다. (물론 127 이전의 코드도 재정의되지만 몇 글자를 제외하고는 ASCII코드와 거의 같습니다)                     한글은 128번 이상의 코드 2개를 조합해서 표시할 수 있습니다. 위의 예에서 printf("%c%c", 184, 184);를 하면 "만"이라는 글자가 나옵니다. 그럼 184와 185를 붙여서 찍으면 뭐가 나올까요? 아마 가나다순에 의해 "만"의 다음에 해당하는 글자가 그 자리에 있을테니 그 글자가 나오겠죠. 

한글은 ASCII 코드 한 자리로는 표현할 수 없습니다. 자소라면 가능하지면 음절은 그 수가 많아서 255개로는 표현이 안 됩니다. 그래서 두 Byte를 사용해서 표현합니다. 두 바이트로는 65536가지 경우의 조합이 만들어집니다.  그곳에 한글, 한자가 들어있는 것이죠.

한글은 단 한글자라도 메모리상에는 2byte를 차지합니다. %c가 두개 조합돼야 하니까요. 즉, char han_char[3] = "한\0"; 이렇게 문자열로 사용되며 null문자를 포함하면 총 3문자가 필요합니다. 홍길동을 문자열에 저장하면 null문자를 포함해서 총 7byte가 필요하죠. char han_str[7] = "홍길동\0";

그러니 한글 한 글자를 표현한다고 char han_char = '홍';이라고 하면 안 됩니다. 한글은 영어와 달리 1byte로 표현할 수 없어서 char han_char = '홍'; 이라고 쓸 수 없습니다. 즉, 작은 따옴표도 쓸 수 없고 배열이나 포인터가 없는 단순한 char형 변수로 선언,정의될 수도 없습니다.

이것은 "홍길동"이라는 문자열의 값을 알아내는 코드입니다.

실행결과를 보시면, -값으로 나오죠? 부호가 있는 숫자로 찍었기 때문이죠. 그래서 부호가 없는 char로 바꾼 것이 아래에 있는 것입니다. 보시면 127보다 다 큰 수임을 알 수 있습니다. 마지막 0은 null문자의 값이죠.

 

정리를 하겠습니다.

한글은 unsigned char의 128번 이상의 영역에 숨어있었다.

한글은 단 한글자라도 2byte씩 차지하므로 영문처럼 1byte로 지정할 수 없으며 반드시 문자열로 지정해야 한다.

 

덧붙여 드릴 말씀은 128 이상의 코드를 단 하나만 찍으면 한글의 모양이 제대로 나오지 않습니다. 코드의 조합이 완성되지 않아  깨져서 나오게 되는 것이죠.

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼