그렇다면, 원하시는 대로 char *str 에 자음과 모음을 분리해서 저장하려면 우선 유니코드로 들아온 글자를 분리하는 로직이나 테이블을 따로 만들어야 할것 같군요. 다른 좋은 방식을 여기 들어오시는 고수들께서 또 올리실것으로 생각합니다만, 구글링으로 비슷한 주제를 다룬 '알쯔' 라는 분의 PHP 코드 예를 찾아 링크를 남겨 둡니다.
19 * 21 * 28 = 11172자가 빈 자리 하나 없이 순서대로 연속 배치되어 있기 때문에 나눗셈 몇 번이면 분리할 수 있습니다.
진짜 어려운 문제가 뭐냐면, C언어의 멀티바이트 문자열로부터 유니코드를 얻어내는 거지요.
이 부분을 이식성 있게 작성하려면 조금 골치가 아픕니다. 저는 C언어의 여러 부분을 관심 가지고 공부했지만, 로케일이나 문자셋 변환 같은 부분은 손대기 골치 아파서 매번 필요한 만큼만 알아봐서 쓰고 그랬거든요.
귀찮아서 그냥 이렇게만 쓰고 넘어갈까 했는데, 몇 개월 주기로 이런 비슷한 질문을 보고 있기도 하고, 저도 공부삼아 제대로 동작하는 예제 코드 하나 만들어서 제 kldp 발자취에 남겨 놓으면 나중에 써먹을 일이 있지 않을까 싶어서 한번 만들어봤습니다. 참조해보세요.
Ubuntu 14.04.5 LTS
Linux 3.13.0-107-generic #154-Ubuntu SMP Tue Dec 20 09:57:27 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
gcc -std=c99 -pedantic -pedantic-errors
그리고 그걸 명시한다는 건 이식성에 썩 자신이 없다는 뜻이기도 하죠. -_-;;;
특히 setlocale(LC_ALL,"en_US.UTF-8"); 부분이 중요해 보이는데, 이게 정확히 무슨 의미인지, 다른 플랫폼에서는 어떻게 바꿔 주어야 하는지 감이 잘 안잡힙니다. -_-;; 로케일 언제 공부하지...
(2017-02-02 내용 수정: setlocale(LC_ALL,"");로 바꿨습니다.)
흥미있는 주제의 질문입니다.
컴퓨터에서 한글은 UTF-8 이나 EUC-KR 로 표시되는데, 이 두 코딩체계의 문제는 한글을 자음, 모음 또는 초성, 중성, 종성으로 분리하는것이 아니라 글자 별로 코드를 정한다는 겁니다. 예를 들어 '안' 은 C54, '녕' 은 B15 ... 이런식으로.
유니코드(UTF-8) 테이블
그렇다면, 원하시는 대로 char *str 에 자음과 모음을 분리해서 저장하려면 우선 유니코드로 들아온 글자를 분리하는 로직이나 테이블을 따로 만들어야 할것 같군요. 다른 좋은 방식을 여기 들어오시는 고수들께서 또 올리실것으로 생각합니다만, 구글링으로 비슷한 주제를 다룬 '알쯔' 라는 분의 PHP 코드 예를 찾아 링크를 남겨 둡니다.
알쯔의 외부기억장치
여의도자바
일단 문자를 유니코드로 변환하기만 하면 아주 간단한
일단 문자를 유니코드로 변환하기만 하면 아주 간단한 문제가 됩니다.
모든 한글 음절이 유니코드에 U+AC00(가)부터 U+D7A3(힣)까지 사전순으로 올라가 있기 때문이지요.
초성 19자 : ㄱ,ㄲ,ㄴ,ㄷ,ㄸ,ㄹ,ㅁ,ㅂ,ㅃ,ㅅ,ㅆ,ㅇ,ㅈ,ㅉ,ㅊ,ㅋ,ㅌ,ㅍ,ㅎ
중성 21자 : ㅏ,ㅐ,ㅑ,ㅒ,ㅓ,ㅔ,ㅕ,ㅖ,ㅗ,ㅘ,ㅙ,ㅚ,ㅛ,ㅜ,ㅝ,ㅞ,ㅟ,ㅠ,ㅡ,ㅢ,ㅣ
종성 28자 : (없음),ㄱ,ㄲ,ㄳ,ㄴ,ㄵ,ㄶ,ㄷ,ㄹ,ㄺ,ㄻ,ㄼ,ㄽ,ㄾ,ㄿ,ㅀ,ㅁ,ㅂ,ㅄ,ㅅ,ㅆ,ㅇ,ㅈ,ㅊ,ㅋ,ㅌ,ㅍ,ㅎ
19 * 21 * 28 = 11172자가 빈 자리 하나 없이 순서대로 연속 배치되어 있기 때문에 나눗셈 몇 번이면 분리할 수 있습니다.
진짜 어려운 문제가 뭐냐면, C언어의 멀티바이트 문자열로부터 유니코드를 얻어내는 거지요.
이 부분을 이식성 있게 작성하려면 조금 골치가 아픕니다. 저는 C언어의 여러 부분을 관심 가지고 공부했지만, 로케일이나 문자셋 변환 같은 부분은 손대기 골치 아파서 매번 필요한 만큼만 알아봐서 쓰고 그랬거든요.
귀찮아서 그냥 이렇게만 쓰고 넘어갈까 했는데, 몇 개월 주기로 이런 비슷한 질문을 보고 있기도 하고, 저도 공부삼아 제대로 동작하는 예제 코드 하나 만들어서 제 kldp 발자취에 남겨 놓으면 나중에 써먹을 일이 있지 않을까 싶어서 한번 만들어봤습니다. 참조해보세요.
정상 동작을 확인한 컴파일 및 테스트 환경은 아래와 같습니다.
그리고 그걸 명시한다는 건 이식성에 썩 자신이 없다는 뜻이기도 하죠. -_-;;;
특히
setlocale(LC_ALL, "en_US.UTF-8");
부분이 중요해 보이는데, 이게 정확히 무슨 의미인지, 다른 플랫폼에서는 어떻게 바꿔 주어야 하는지 감이 잘 안잡힙니다. -_-;; 로케일 언제 공부하지...(2017-02-02 내용 수정:
setlocale(LC_ALL, "");
로 바꿨습니다.)그런 면에서, 저보다 더 고수이신 분이 답을 달아 주시기를 저도 기다려야겠습니다.
역시~ "짱" 입니다요!
이곳에 자주 기웃거리는 이유중 가장 중요한 이유!
(언젠가 해 보고 싶었는데) 저도 잘 참조 하겠습니다. 고맙습니다.
여의도자바
로캘 아니고 로케일 인가요?
로캘 아니고 로케일 인가요? locale을 사전에서 찾아 보니 발음이 로케일 보다는 로캘 또는 로칼에 가까운 거 같아서요. 고수 아니어도 답변 달아도 되겠죠?
세벌 https://sebuls.blogspot.kr/
별것도 아닌걸로 물고늘어지시네요..
저도 로케일이라고 읽습니다
답글 감사합니다.
많은 것을 배우고 가요.
테스트 해보겠습니다.
감사합니다!
utf8 nfd 로 검색해보세요.
utf8 nfd 로 검색해보세요.
nfd(풀어쓰기) 와 자모음 분리는 미묘하게 다르긴합니다만...
uconv 는 icu 패키지에 포함된 유틸이며,
apple 이 공개 배포하는 수정된 libiconv 패키지에 utf8-mac 이라는 이름으로 포함된 놈이 utf8 nfd 입니다.
덧
icu 의 unicode normalization 부분만 쓰고 싶다면 GNU libunistring 도 있습니다.
참고용으로 올려봅니다.
완성형 문자코드를 조합형 문자코드로 변환하는 방법 ★★★★★ C / C++ / WIN32 API ★ IME(Input Method Edit) | 디버깅과 테스트
http://blog.daum.net/knightofelf/17717
완성형 한글
http://codepad.org/aeH3xFUC
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
깃헙에 검색하니 하나 나오네요..
https://github.com/taej0127/Hangul
이민철 올림
댓글 달기