한글에서 초성 뽑아내기 방법은?

shean0의 이미지

안녕하세요..
임의의 텍스트에서 초성을 뽑아서 DB에 저장하려구 합니다.
예를들어 "가나다" ==>"ㄱㄴㄷ"
그런데... 이것의 방법을 그냥 간단하게 매 2byte씩 마다 & 0xF 를 하여서
뽑을려구 하였더니...안 되더군요..

한글의 초성을 어떻게 뽑아내죠??

그리고 임의의 첫 글자가 한글인지? 아니면 영어인지 구별하는 방법은?
일단 제 생각에는 tmp[0] & 0xF 해서 bit로 '100' 이상이면 한글이다
즉 int_c=(tmp[0] & 0xF)
if(int_c >= 6) 한글이다
else 한글이 아니다
이렇게 생각하고 있습니다.

관련된 자료와...팁을 부탁드립니다.

dyaus의 이미지

한글코드 변환에 대해서 검색해 보시면 괜찮은 답을 구하실 수 있을 것 같군요.
일단 한글영역과 자음만 표시하는 영역이 다르기 때문에.
한글영역에서 자음으로 변환하는 과정이 추가적으로 요구 될 것 같습니다.

 
 a: 2byte 를 읽는다.
 b: 한글인지 확인한다.  Y: goto c N : goto a
 c: 한글중 어느 영역인가 -> 해당 자음 출력
 


한글과 코드( http://trade.chonbuk.ac.kr/~leesl/code/ ) 페이지를 살펴보시면 도움이 될 것 같습니다.
keizie의 이미지

iconv 등을 이용해 유니코드의 Hangul Syllables 영역으로 바꾼 다음
수식으로 간단하게 Hangul Jamo를 뽑아낼 수 있습니다.

http//gnome.or.kr/moin.cgi/HangulSyllables

shean0의 이미지

안녕하세요..말씀하신 문서를 보면서..고민중에 있습니다.

Quote:
[가나다]
[ffffffb0] [ffffffa1] //<==가
[ffffffb3] [ffffffaa] // <==나
[ffffffb4] [ffffffd9] // <==다
mylog[?
0[ffffffa1] <== 'ㄱ' 을 찍었을경우 buf='ㄱ' 으로 입력한 경우
1[0] 2[0]

일단 제가 한것을 말씀드리면. (아 환경은

$env <결과>
NLS_LANG=American_america.KO16KSC5601  :ksc5601
LANG=ko
 
) 입니다.

이런식으로 로그가 만들어 지더군요..
( buf[i] & 0x80 )으로 매 2바이트씩(첫바이트/2바이트중)하여서 결과가 나오면 한글로 간주하고 다음( i+1)[즉2방이트]를 한글로 간주한다.
첫번째 buf[i]가 "자음"이다

라고 결론을 낼려구 합니다. 이것은 일견 맞게 생각되구요..
중간에 space나 영어 숫자가 나오면 1칸 건너뛰고 다음바이트를 다시 검색하도록 할 것입니다.

Quote:

그런데..문제는 이렇게 뽑아낸 (예를 들면 "가"의 <==이거 스트링이 맞죠?
b0 a1에서 b0를 쓰면 되겠다 생각하고 있었거든요.
그리고 buf='ㄱ' 으로 입력을 하고 hex로 찍어보니..
0[ffffffa1] <== 'ㄱ' 을 찍었을경우 buf='ㄱ' 으로 입력한 경우
이런식으로 나오더군요..

여기서 문제에 봉착하였습니다.
일단 한글에서 자음을 찿는것은 2바이트 마다 첫 바이트를 자음으로 간주한다
라고 하면 될듯 한데..
그 바이트를 어떻게 이용해서 DB(오라클) 에 넣어야 할지...

일단은 insert into AAA ( name_han_first ) value ( 'ㄱㄴㄷㄹ' ); 이렇게 생각하고 있습니다.

조언을 부탁드리며
소스를 올릴 필요는 없지만..보시면..어떤 의도인지 더 잘 아시겟죠?
다음 추가로 조언부탁들릴때는 proc로 짠것으로 올리겠습니다.

/**********************************************
gcc -o Make_Han Make_Han.c
***********************************************/
#include<stdio.h>
#include<string.h>
int mylog(char *buf,int start,int end);
int exject_first(char *in_tmp,char *out_tmp);
int main()
{
   char input_tmp[30];
   char output_tmp[15];
   memset(input_tmp,0x0,sizeof(input_tmp)); //string.h
   memset(output_tmp,0x0,sizeof(output_tmp)); //string.h

   fscanf(stdin,"%s",input_tmp);
   exject_first(input_tmp,output_tmp);
   return 1;
}

int exject_first(char *in_tmp,char *out_tmp)
{
   char Fir;
   int p,len,i;
    printf("[%s]",in_tmp);
   len=strlen(in_tmp);
   i=0;
   for(p=0;p<len;p++)
   {
      i = 2*p;
      in_tmp[i]=(in_tmp[i] & 0xFF);
      in_tmp[i+1]=(in_tmp[i+1] & 0xFF);
      printf(" [%x] ",in_tmp[i+0]);
      printf("[%x]\n",in_tmp[i+1]);
   }

   out_tmp[0]='ㄱ' ;
   mylog(out_tmp,0,3);

   return 1;
}
int mylog(char *buf,int start,int end)
{
    int i;
    printf("mylog[%s]\n",buf);
    for(i=start;i<end;i++)
    {
         printf("%d[%x] ",i,buf[i]);
         if(!(i%10))printf("\n");
    }
    printf("\n");
}
:q!

언제나 즐프를 꿈꾸며~

익명 사용자의 이미지

Quote:
일단 한글에서 자음을 찿는것은 2바이트 마다 첫 바이트를 자음으로 간주한다
라고 하면 될듯 한데..

완성형 한글은 자체에 자소 정보가 없기 때문에 자소 정보를 추출할 수 있는 한글 코드로 변환해서 추출해야 합니다. 위에 kz님이 말씀하신 것처럼 유니코드로 변환한 뒤 공식을 이용해서 자음을 뽑아내는 게 가장 쉬운 방법일 듯 합니다. 유니코드 한글은 완성형겸 조합형이라는 특이한(?) 성질이 있어서 여러모로 좋습니다.
maddog의 이미지

방준영님 말씀대로 한글 코드 변환이 필수적인것 같네요.
일단 완성형은... 별도로 테이블을 가지고 있지 않는 이상은
힘들것 같구요. 유니코드로 변환하면 초성은 그렇다처도
중성이나 종성을 뽑아내기는 쉽지 않을 것 같습니다.
뭐, 필요 없다면 그정도로 상관없겠지만요.

중성이나 종성까지도 필요하다면 별수 없이 조합형으로
변환하는 수 밖에 없을 것 같죠...

더불어 DB에 저장하는 것도 제가 보기은 'ㄱ'을 저장하는
것 보다는 각 자모에 대응되는 숫자를 저장하는게
더 유용하지 않을까 생각되네요.

걱정은... 문제의 확장 완성형인데요... 이거 참 걱정되는
코드죠... 지원할 수도 없고 안할 수도 없고... 참 애매합니다...

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
재미없는 일은 하지 않겠다는 인간 쓰레기. ㅡ,.ㅡ;;
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

keizie의 이미지

유니완성형에서 첫소리만 뽑아낼 수 있는 건 아닙니다. 그렇게 허술하면 그렇게 유명하겠습니까? )
확장완성형은 유니코드를 지원하면 그냥 해결되는 문제입니다.

maddog의 이미지

너무 오래된 이야기였었나봅니다. -.-;
유니코드 2.0에서 지웠됐다고 나오네요.
(음.. 그럼 내가 봤던 문서들은 뭐야... -.-; 95년에 제정된거라는데... -.-;)
프로그래머가 게을러야 할 때가 있고 게을러서는 안되는
영역도 있나봅니다....
(죽자, 죽어... -.-;)

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
재미없는 일은 하지 않겠다는 인간 쓰레기. ㅡ,.ㅡ;;
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

익명 사용자의 이미지

ㅆㅂ=띠발

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.