강의실/텍스트기반SW

오늘은 학생이 c언어에서 문자열이 입력 되었을때...

영문자 이거나 한글에서 맨 앞의 한글자만 출력해야 하는데 어떻게 하는지 묻길래 C언어에서 한글인지 영문인지 체크하는 방법을 알아 볼까 합니다.


먼저 다음과 같이 

char Kor[] = "한글";

char Eng[]="English";

과 같이 변수를 선언하면서 데이터를 입력하면

먼저 strlen(Kor) 을 출력해 보면 4 또는 6이 나오는 것을 확인하실 수가 있는데요.

이것은 컴파일러마다 조금씩 다르기는 하지만 한글 같은 경우 2byte 혹은 3바이트를 사용하기 때문입니다.

그렇다면 Kor[0] 을 출력하면 당연히 "한" 이라는 글자는 출력 되지 않을 것입니다.


먼저 이러한 원리를 이해하기 위해서는 ASCII 코드를 이해 해야 되는데요.

이미지 출처 - http://shaeod.tistory.com/228


1Byte 로 저장할 수 있는 값은 8비트이므로 0x00(0) ~ 0xFF(255) 까지 입니다.

0부터 255 중에서 우리가 출력이 가능한 수는 일반적으로 0x20(32) ~ 0x7F(127) 까지 사용하고 있구요,

영문자 A~Z 까지는 0x41(65)~0x5A(90) a~z는 0x61(97)~0x7A(122) 까지를 사용하는 것을 알 수 있습니다.

따라서 한글이나 한문,일본어와 같은 경우는 당연히 1byte 가지고 처리가 안됩니다.

따라서 한글과 같은 경우는 2byte 혹은 3byte 로 처리를 하게 되는데요.

윈도우 내부적으로 사용하는 유니코드(UTF-16) 에서 2바이트로 사용을 하기 때문에 일단 2바이트를 가지고 설명을 하겠습니다.

먼저 UTF-16은 16비트 기반으로 문자열을 저장합니다. 기본 다국어 평면에 속하는 문자들은 16비드 값으로 인코딩 되고 그 이상의 문자는 특별히 정해진 방식으로 32비트로 인코딩 됩니다.


한글은 16비트로 사용 가능하며 유니코드 테이블 값을 확인해 보면 한글은 다음과 같습니다.

출처- https://en.wikipedia.org/wiki/Hangul_Syllables


테이블을 확인해 보면 0xAC00~0xD7A3 까지 한글을 사용하는 것을 확인해 볼수가 있습니다.

이것을 이진수로 변환해 보면 1010110000000000 ~ 1101011110100011 인것을 확인할 수 있습니다.

이때 앞의 8비트만 확인해 보면

10101100 ~ 11010111  인것을 확인 할 수가 있는데요.

우리가 사용하는 일반 알파벳은 0x20~0x7F 까지 사용한다고 하더라도

00100000 ~ 01111111 인 것을 확인할 수가 있습니다.

따라서 첫번째 비트가 1 로 시작하면 한글이고 0으로 시작하면 일반 Ascii 값이라는것을 판단 할 수가 있는데요.


이렇게 한바이트의 맨 처음 비트가 1인지 0 인지를 판단 하기 위해서는 0x80( 이진수로 변환하면 10000000) 을 비트연산 중 & 연산하여 0 이 나오는지 아닌지로 판단하면 됩니다.


따라서 위의 예에서

if(Kor[0] & 0x80) 를 하면 참이 나오고

if(Eng[0] & 0x80) 을 하면 거짓이 나옵니다.


따라서 어떤 문자열의 처음 한자리가 영문인지 한글인지 판단하여 처음 한자리만 출력 하는 것은 다음과 같이 판단하면 될것 같네요.

char str[1000];

scanf("%s",str);

if(str[0] & 0x80)

{

   //한글이므로 두바이트를 출력해 주어야 한다.

   printf("%c%c",str[0],str[1]);

}

else

{

   //일반 Ascii 값으로 한바이트만 출력 하면 된다.

  printf("%c", str[0]);

}









이 장소를 Daum지도에서 확인해보세요.
인천 서구 당하동 1028-2 장원프라자 502호 | 원당컴퓨터학원
도움말 Daum 지도
7 0
  • 보여주는남자 2018.08.28 13:11 신고    

    완전 핵심적인
    근본에 다가선 기초부터 차근 차근 다져지는 기분이에요
    요즘처럼 과정은 알기싫고 결과만 얻으려하는 현실에서 그중 누군가는 이렇게 기본기부터 다져가고 싶은이가 있으리라 생각합니다
    처음에는 뒷쳐지는것 같을지라도 언젠가 깨닫게 되리라 생각합니다
    기초가 가장 중요하다는것을

  • 행복사냥이 2018.08.28 13:22 신고    

    잘 모르는 내용을 자세하게 설명해 주신것 같아요.^^

  • 유하v 2018.08.28 14:10 신고    

    봐도 어렵네요ㅋ;;; 학생들에게 도움이 되었음 합니다ㅎ

  • 휴식같은 친구 2018.08.28 14:37 신고    

    C언어에서 한글을 표현하는 방법이군요.
    잘 보고 갑니다.
    즐거운 하루 되세요~^^

  • 버블프라이스 2018.08.29 06:19 신고    

    예전에 컴퓨터 학원에서 2진법과 10진법을 공부했었던 기억이 있는데요- 물론 지금은 오래돼서 다 까먹었습니다 ㅠㅜ ‘C언어에서 문자열이 한글인지 확인 하는 방법’ 학습하고 갑니다^^;

  • 핑구야 날자 2018.08.29 06:53 신고    

    C 언어를 사용해 본지 꽤 오래됐지만 다시 봐도 당장 코딩 할 수 있을 것 같은데요

  • 공수래공수거 2018.08.29 08:31 신고    

    C언어에서 한글인지 영문인지 체크하는 방법을 알려 주셨군요
    배우는 학생들에게 좋은 팁이 될수 있겠습니다