Q&A

  • 한글 자모 분해 에 관한 질문( 소스포함)
이 소스는 조준래님 홈 에서 참고하였습니다.

unit Unit1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;



type

TForm1 = class(TForm)

Button1: TButton;

Edit1: TEdit;

Edit2: TEdit;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

function HanDiv(const Han:PChar;Han3:PChar):Boolean;

function HanDivPas(const Src:String):String;

public

{ Public declarations }

end;

const

ChoSungTbl: PChar = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ';

JungSungTbl:pchar = 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ';

JongSungTbl:pchar = 'ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ';

UniCodeHangeulBase = $AC00;

UniCodeHangeulLast = $D79F;

var

Form1: TForm1;



implementation



{$R *.DFM}

function TForm1.HanDiv(const Han:PChar;Han3:PChar):Boolean;

var

UniCode:integer;

ChoSung,jungsung,jongsung:integer;

begin

Result := False;

MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,Han,2,@UniCode,1);

if(UniCode < UniCodeHangeulBase) or

(UniCode > UniCodeHangeulLast) then Exit;





UniCode := UniCode - UniCodeHangeulBase;

ChoSung := UniCode div (21 * 28);

UniCode := UniCode mod (21 * 28);

JungSung := UniCode div 28;

UniCode := UniCode mod 28;

// 1번 주석 JongSung := UniCode;<-여기 주석을 풀면 UniCode에 터무니 없는 데이터가 넘어옴.

strLCopy(Han3,ChoSungTbl + ChoSung * 2,2);

StrLCopy(Han3 + 2,JungSungTbl + JungSung * 2,2);

StrLCopy(Han3 + 4,JongSungTbl + jongsung * 2,2);//jongsung 값이 계산 된 값이 아

//니기 때문에 초성 중성은 맞게 나오는데 종성값이 틀림.

Result:= True;

end;

function TForm1.HanDivPas(const Src:String):String;

var

Buff:array[0..6] of char;

begin

result :='';

if Length(Src) = 2 then begin

if HanDiv(PChar(Src),Buff) then begin

Buff[6]:= #0;

Result:= String(Buff);

end;

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

var

strout:string;

begin

//string:= edit1.text;

strout :=hanDivPas(Edit1.Text);

edit2.Text:=strout;

end;



end.

위에 주석을 달았듯이. '강' 이란 한글을 입력하고 버튼을 누르면 ㄱㅏㅇ이런식으로 분해 되어야 하는데 종성값이 이상하게 됩니다.

1번 주석을 풀면 UniCode에 넘어오는 값이 전혀 이상한 값으로 넘어 옵니다.

이 문제를 해결해 주시면 정말 감사하겠습니다.

2  COMMENTS
  • Profile
    이재식 2000.06.29 05:07
    이재식 Wrote :

    안녕하세요?



    본 소스에서 크게 잘못된 부분은 없습니다.



    이 소스는 그대로 사용하면 님의 말씀처럼 에러가 나오는군요...



    이렇게 수정하세요.

    제가 유니코드(한글)를 조사해서 소스와 대조해보니까, 특별히 잘못된 부분은 없고요,

    종성계산에서 삐끗했군요...



    function TForm1.HanDiv(const Han:PChar; Han3:PChar):Boolean;

    var

    UniCode:integer;

    ChoSung,jungsung,jongsung:integer;

    begin

    Result := False;

    Unicode := 0 ; // 반드시 필요

    MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,Han,2,@UniCode,1);



    if(UniCode < UniCodeHangeulBase) or

    (UniCode > UniCodeHangeulLast) then Exit;





    UniCode := UniCode - UniCodeHangeulBase;

    ChoSung := UniCode div (21 * 28);



    UniCode := UniCode mod (21 * 28);

    JungSung := UniCode div 28;



    UniCode := UniCode mod 28;

    JongSung := UniCode-1; // -1를 해주어야 정확한 것임



    strLCopy(Han3,ChoSungTbl + (ChoSung * 2) ,2);

    StrLCopy(Han3 + 2,JungSungTbl + (JungSung * 2),2);

    StrLCopy(Han3 + 4,JongSungTbl + (jongsung * 2),2);



    Result:= True;

    end ;



    이상입니다. Handiv함수만 위처럼 수정해주시면 됩니다.



    그럼...

  • Profile
    김경율 2000.06.30 18:08
    답변 감사 합니다.

    늘 행복하시고 하시고자 하는 모든일들이 다 잘 되었으면 합니다.



    • hsband
    • 2000.06.29 05:47
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이상우
      2000.06.29 06:53
      hsband wrote: > 저는 초보인데요, 이렇게 질문만 올리게 되내요. 아주 간단한 것 같은데요 memo 콤포넌...
    • 김양미
    • 2000.06.29 02:48
    • 3 COMMENTS
    • /
    • 0 LIKES
    • cell
      2000.06.29 02:55
      Button4Click(Sender); 또는 button4.Click; 이렇게 하면 됩니다.
    • 김영해
      2000.06.29 02:53
      김양미 wrote: > 잉잉... ㅠ.ㅠ > 조금 알까 싶으면 저리로 도망가고.. 델이 밉슴다... 버뜨 좋다... *^^...
    • 김양미
      2000.06.29 03:28
      남은 시간도 좋은 시간 만드세요~!!! 행복하세요~~ *^^*
    • 김영희
    • 2000.06.29 02:21
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최영근
      2000.06.29 09:38
      김영희 wrote: > > 간단한 프로그램인데요 > 폼도 단 두개, 출력만을 위한 겁니다. > > 출력을 위해...
    • cell
      2000.06.29 03:08
      레코드를 select한후 다시 편집해서 변수에 넣은 건가요. 변수의 갯수가 어느정도 되는지... 자세한 내용...
    • 김경율
    • 2000.06.29 01:52
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이재식
      2000.06.29 05:07
      이재식 Wrote : 안녕하세요? 본 소스에서 크게 잘못된 부분은 없습니다. 이 소스는 그대로 사용하면...
    • 김경율
      2000.06.30 18:08
      답변 감사 합니다. 늘 행복하시고 하시고자 하는 모든일들이 다 잘 되었으면 합니다.
    • 전해영
    • 2000.06.29 01:46
    • 2 COMMENTS
    • /
    • 0 LIKES
    • cell
      2000.06.29 03:45
      전해영 wrote: > 델파이 프로그램내에서 엑셀혹은 이와유사한 기능을 사용하여 데이타를 가공후 > 오라클...
    • 이재식
      2000.06.29 03:38
      전해영 wrote: > 델파이 프로그램내에서 엑셀혹은 이와유사한 기능을 사용하여 데이타를 가공후 > 오라클...
    • 조선일
    • 2000.06.29 01:45
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 윈디하나
      2000.07.04 23:26
      직접 Win32 API를 사용하셔야 합니다. GetPrevilige~로 시작하는 함수로 기억합니다만... 그럼 이만...
    • cell
      2000.06.29 02:29
      편법으로 가능합니다. 먼저 calculate field인가 한국식으로 계산 필드를 하나 생성하시고 그다음 on cal...
    • 김영해
      2000.06.29 01:52
      사발우성 wrote: > > 안뇽 하신가엽 여러 고수님 & 중수님... > > 전 울트라 캡숑초보...헐 프로그...
    • 사발우성
      2000.06.29 02:11
      ^^ 죄성엽.. 지금 제가 로컬 디비(파라독스)를 사용하구 있어서엽... 어떻게 해야할쥐를 모르겠네...
    • 준희
    • 2000.06.29 01:03
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 조상
      2000.06.29 01:47
      준희 wrote: > 안녕하세요.. > > 다름이 아니라 Form 호출에러가 발생해서 그러는데 도대체 어디서 잘...
    • 김영해
      2000.06.29 01:46
      준희 wrote: > 안녕하세요.. > > 다름이 아니라 Form 호출에러가 발생해서 그러는데 도대체 어디서 잘...
    • 준희
      2000.06.29 02:47
      김영해 wrote: > 준희 wrote: > > 안녕하세요.. > > > > 다름이 아니라 Form 호출에러가 발생해서 그...
    • 사발우성
      2000.06.29 01:10
      ^^ 사발임당... 전 완전 초본디엽.. 컁 form2:Tform2.creat(self); form2.show; 이렇게 ...
    • 이경문
      2000.06.29 01:39
      Modal폼은 그 자체가 시행이 끝나기 전까지는 메인폼(Modal폼을 부른 폼)으로 돌아가지 않는 성질을 갖...
    • cell
      2000.06.29 02:40
      심동훈님이 아니라 죄송하네요.... 저도 rs-232통신을 많이 사요하기 때문에 몇자 적습니다. 제가 알기...
    • 장형욱
      2000.06.29 03:23
      cell님 안녕하십니까? cell님께 감사의 말씀 전합니다. 이렇게 한수 가르켜주시니 정말 고맙습니다. ...
    • 장형욱
      2000.06.29 03:23
      cell님 안녕하십니까? cell님께 감사의 말씀 전합니다. 이렇게 한수 가르켜주시니 정말 고맙습니다. ...
    • DaeSung
    • 2000.06.29 00:44
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 2000.06.29 00:01
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이미나
      2000.06.30 00:37
      저두 MS-SQL에 delphi로 프로젝트 경험이 있습니다. 헌데 win98, 95 모두 BDE 설정시 문제가 없었네요. ...
    • 이재식
      2000.06.29 03:48
      이재식 Wrote : 안녕하세요? 인식못할 이유가 없다고 생각합니다. 작업과 환경을 98에서 하신것처럼 ...
    • cell
      2000.06.29 03:12
      혹시 95에 ms-sql client가 설치되어 있지 않거나, 아니면 client설치 없이 사용할 때 필요한 DLL이 없...
    • heimdal
    • 2000.06.28 23:37
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 까마귀
      2000.06.29 20:10
      heimdal wrote: > 페이지컨트롤에 탭시트가 두개가 있습니다.. > 탭시트1에 4개의 입력창이있고 탭시트2...
    • 초보초보
      2000.06.29 00:01
      heimdal wrote: > 페이지컨트롤에 탭시트가 두개가 있습니다.. > 탭시트1에 4개의 입력창이있고 탭시트2...
    • heimdal
      2000.06.29 01:08
      초보초보 wrote: > heimdal wrote: > > 페이지컨트롤에 탭시트가 두개가 있습니다.. > > 탭시트1에 4개...
    • cell
      2000.06.29 03:00
      setfocus 전에 먼저 페이지탭의 이동을 해야지요 pageControl1.ActivePageIndex := 0 과 같이요.
    • 이경수
    • 2000.06.28 23:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 강인규
      2000.06.28 23:49
      허일학님의 자료중 일부를 발췌합니다. 자세한건 허일학님의 홈이나 자료실의 xProject프로그램을 참고하...
    • 이경문
      2000.06.29 01:42
      우선 S의 내용을 로컬에 저장하고(c:temp.txt) WebBrowser1.Navigate('c:temp,txt', 어쩌구저쩌구) 하면 ...
    • 초보
      2000.07.05 02:50
      > 우선 S의 내용을 로컬에 저장하고(c:temp.txt) > WebBrowser1.Navigate('c:temp,txt', 어쩌구저쩌구) 하...