C언어 한글 자모 분리하기 문제
글쓴이: ozon1000 / 작성시간: 화, 2017/01/31 - 9:35오후
연휴 잘 보내셨나요?
얼마 전 제목과 같은 주제로 포럼에 글을 올렸던 적이 있습니다.
제가 부족한 탓에 결과적으로 만족스러운 출력을 낼 수 없었고 염치 없지만 다시한번 KLDP에 글을 쓰게 되었습니다.
개발 환경은 ubuntu 16.04 이며 utf-8 환경입니다.
입력으로 다음과 같은 변수에 이렇게 들어옵니다.
char *hangul = "안녕";
그리고 출력으로 다음과 같이 얻고 싶습니다.
char *result = "ㅇㅏㄴㄴㅕㅇ";
솔직히 많이 어려웠습니다. 어떤 식으로 접근을 해야 할지도 몰랐고요.
전체적인 느낌은 이해했지만 직접적으로 코딩을 하는것에 어려움이 많았습니다.
어떻게 유니코드로 변환해서 정해진 수식을 거쳐 분리해야 하는지 잘 모르고 있는게 현실입니다.
혹여나 지나 가시다가 이 글을 읽으시면 한번쯤 관심가져 주시면 감사드리겠습니다.
읽어주셔서 감사합니다.
항상 많이 배우고 있습니다.
Forums:
혹시, 글 수정하기 버튼은 없나요?
code가 이상하게 들어갔는데, 수정하려니 버튼이 안보이네요...
댓글로 요청해 주시면 보는대로 수정해 드립니다.
댓글로 요청해 주시면 관리자 분들이 보는대로 수정해 드립니다.
이전에 답변드렸던 사람입니다.
이전에 답변드렸던 사람입니다.
https://kldp.org/node/156803
제 코드가 동작하지 않는지요?
지금 테스트해보기로는 Ubuntu 16.04.1 LTS, 로케일 en_US.UTF-8에서 잘 동작하는데요.
setlocale(LC_ALL, "en_US.UTF-8");
를setlocale(LC_ALL, "");
와 같이 고치는 것이 더 낫다고 하더군요. 이러면 현재 시스템 로케일을 따라가는 모양입니다만, 사실 여전히 그 부분은 잘 모릅니다.덧. 이 경우엔 그냥 예전에 쓰신 글에 댓글을 다시면 통째로 끌어올려집니다.
테스트 결과를 알려드려야 될 것 같아..
테스트 결과를 알려드려야 저도 그리고 답변자님도 이해가 빠르실 것 같아 글을 씁니다.
말씀하신 코드는 테스트 해봤습니다.
gcc로 컴파일 하면 다음과 같은 오류가 생깁니다.
따라서 g++로 컴파일을 했고 이상없이 컴파일은 완료됩니다.
그리고 입력을 기다리는 콜솔창에 "김" 이라고 입력 후 엔터를 입력하면
예상되는 "ㄱㅣㅁ"이 아니라 이상한 특수 문자들이 출력됩니다.
혹 이유를 알 수 있을까요?
아래 명령어의 결과를 그대로 보여주세요$ printf
아래 명령어의 결과를 그대로 보여주세요
실행결과입니다.
1. 00000000: eab9 80
2. 김|xb1 그리고 그 뒤에 이상한 특수기호 하나 있어요
3. 이건 잘 모르겠네요 어떤 의도로 실행해보라고 하신지요.
1번결과로 봐서 입력로케일은 utf-8 인것으로
1번결과로 봐서 입력로케일은 utf-8 인것으로 보입니다.
2번결과로 봐서 님의 터미널읜 utf-8 캐릭터를 잘 보여주고 있습니다.
마지막으로 의심해볼점은 소스코드 (원래 쓰레드에서 다른분이 올려주신 코드)의
인코딩이 어떻게 저장되어있는지 입니다. ( 그걸 어떤 파일명으로 저장했는지는 모르겠고요.)
그게 utf-8로 인코딩이 잘되어있다면 잘 동작해야합니다.
잘 동작하지 않는다면
1. 소스코드는 다른 인코딩으로 저장되었다.
2. 그 코드가 아니다. 일부수정했다.
둘중하나입니다. 웬지 2번일것 같네요.
코드를 그대로 보여주시고
컴파일 명령어도 그대로 보여주세요
친절한 답변 감사합니다.
맞습니다. 2번이 코드가 실행되지 않는 원인이었습니다.
이것참,,, 뭐라고 말씀드려야 될지 모르겠네요. 부끄럽기도 하고요.
저도 언젠간 사람들에게 많은 도움이 되는 프로그래머가 되고 싶네요!
감사드립니다.
이건... 정말 이해하기 어렵군요.
이건... 정말 이해하기 어렵군요.
아주 잘 짜인 코드라던가 이식성이 보장되는 코드라고 할 수는 없더라도,
최소한 C언어 코드에서 돌연 gxx가 언급되는 문제가 생길 거라고 예상하지는 못했는데요.
뭔가 제가 이해하는 수준을 넘어서는 문제가 있는 것 같습니다. 컴파일 및 테스트 환경에 대해 좀 더 알려주실 수 있으신지요.
CentOS 7 환경에서 gcc/g++ 모두 빌드 잘
CentOS 7 환경에서 gcc/g++ 모두 빌드 잘 되고 동작 잘 하네요. 저도 별 문제 없을 것 같은데 혹시나 해서 테스트 해 봤습니다. 아마도 질문하신 분의 소스에 코드를 덮입히면서 발생한 문제가 아닐까 싶은데요.
CentOS 7.3
아 코드는 utf-8 format 입니다. 소스 코드가 cp949 일 경에는 빌드 에러는 안나지만 결과가 아래와 같습니다. 당연한 결과 이기는 하지만..
Challenge accepted.
Challenge accepted.
이제 최소한 코드 자체는 인코딩에서 자유로워졌습니다. 보시면 아시겠지만 한글 자모를 소스코드에 직접 입력하는 대신 유니코드로
wchar_t
타입 배열에 저장했죠.init_korean_syllable_table
함수가 멀티바이트 한글 자모 문자열들을 생성합니다.여전히 불완전한 부분이 남아있기는 합니다. 일단 원론적으로는 C99에서 wide character가 유니코드라는 보장이 없다는 점... -_-;; C11부터 유니코드 지원이 들어오던가요. 그건 넘어가더라도
wctomb
함수도 문제인데setlocale
함수에 cp949나 euckr 같은 걸 넘겨주고 실행해보니까init_korean_syllable_table
함수가 실패하는군요. 저 두 인코딩에 한글 자모가 없을 리가 없는데, 아오. 뭔가 제가 모르는 게 더 있는 모양입니다.어쩌다보니 wide-multibyte 양방향 변환을 다 하는 예제를 만들게 됐네요.
소스의 가독성은 난해하네요...컴퓨터는 이해하겠지만
소스의 가독성은 난해하네요...컴퓨터는 이해하겠지만 사람이 이해하기는 어려울 듯.
세벌 https://sebuls.blogspot.kr/
참고용으로 올려봅니다.
완성형 문자코드를 조합형 문자코드로 변환하는 방법 ★★★★★ C / C++ / WIN32 API ★ IME(Input Method Edit) | 디버깅과 테스트
http://blog.daum.net/knightofelf/17717
완성형 한글
http://codepad.org/aeH3xFUC
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기