Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[16110] 한글을 분해하고 조합하는 코드인데 수정 부탁드립니다.
첫눈 [hadugo] 852 읽음    2020-05-21 17:03
https://anal.tistory.com/entry/Delphi에서-한글관련-작업의-사용방법

위 링크에 있는 소스코드입니다.

const

   ChoSungTbl  : String = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ';
   JungSungTbl : String = 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ';
   JongSungTbl : String = '  ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ';

   EngChosung  : String = 'r R s e E f a q Q t T d w W c z x v g ';
   EngJungsung : String = 'k o i O j p u P h hkhohly n njnpnlb m mll ';
   EngJongsung : String = '  r R rts swsge f frfafqftfxfvfga q qtt T d w c z x v g ';

   UniCodeHangeulBase = $AC00;
   UniCodeHangeulLast = $D79F;


   //한글관련
   function  ConvEngToHan(src:String):String;
   function  CutFirstHangul(src:String):String;
   function  DecodingEngToHan(src:String):String;
   function  DivChoJungJong(src:String):String;
   function  CharKeyCheck(c : char):boolean;
   function  MoumCheck(c : char):boolean;
   function  HanDiv(const Han: PChar; Han3: PChar): Boolean;
   function  HanDivPas(const Src: String;Check:integer): String;
   Function  GetHanType(const Src: string): Boolean;


////////////////////////////////////////////////////////////////////////////////
function MoumCheck(c : char):boolean;
Begin
    Result := c in ['k','o','i','O','j','p','u','P','h','y','n','b','m','l'];
end;

function MarkCheck(c : char):boolean;
Begin
    Result := c in ['@','#','$','%','^','&','*','(',')','_','-',' ','+','=','{','}','[',']','|','\','<','>','.',',','/','?',':',';','"',''''];
end;

function CharKeyCheck(c : char):boolean;
Begin
    Result := c in ['A'..'Z','a'..'z'];
end;

function DivChoJungJong(src:String):String;
var  i, j, l : integer;
    Tmp, Res  : String;
Begin
    l := Length(src);
    If (l < 2) or (not CharKeyCheck(src[1])) Then Begin
       Result := Src[1];
       Exit;
    end;
    Tmp := src + '     ';
    {초성}
    i := Pos(Copy(Tmp,1,1),EngChosung);
    If i > 0 Then Begin
       res := Copy(tmp,1,1) + ' ';
       j := 2;
    End Else Begin
       Result := Tmp[1];
       Exit;
    End;
    {중성}
    If (not CharKeyCheck(tmp[j])) or (not MoumCheck(tmp[j]))Then Begin
       Result := Res;
       Exit;
    End Else Begin
       i := pos(Copy(tmp,j,2),EngJungsung);
       If i > 0 Then Begin
          res := res + Copy(tmp,j,2);
          j := j + 2;
       End Else Begin
          res := res + tmp[j] + ' ';
          j := j + 1;
       End;
    End;
    {종성}
    If (not (tmp[j] in [' ','A'..'Z','a'..'z'])) or (MoumCheck(tmp[j]))Then Begin
       Result := res + '  ';
       exit;
    End Else Begin
       i := pos(Copy(tmp,j,2),EngJongsung);
       If i > 0 Then Begin res := res + Copy(tmp,j,2);
       End Else Begin      res := res + tmp[j] + ' ' ;
       End;
    End;
    Result := res;
end;

function DecodingEngToHan(src:String):String;
var  UniCode                             : Integer;
    ChoSung   , JungSung   , JongSung   : Integer;
    ChoSungPos, JungSungPos, JongSungPos: Integer;
    Tmp  : String;
    Tmp2 : Array[0..2] of Char;
Begin
    Result := '';
    Tmp    := DivChoJungJong(Src);
    If Length(tmp) = 1 Then Begin
       ChoSungPos  := Pos(Tmp+' ', EngChoSung );
       JungSungPos := Pos(Tmp+' ', EngJungSung);
       JongSungPos := Pos(Tmp+' ', EngJongSung);
       If       ChoSungPos > 0 Then Result := Copy(ChoSungTbl ,ChoSungPos ,2)
       Else If JungSungPos > 0 Then Result := Copy(JungSungTbl,JungSungPos,2)
       Else If JongSungPos > 0 Then Result := Copy(JongSungTbl,JongSungPos,2)
       Else Result := Tmp;
       Exit;
    End Else If Length(Tmp) <> 6 Then Begin
       Result := Tmp;
       Exit;
    End;
    ChoSungPos  := Pos(Copy(tmp, 1, 2), EngChoSung );
    JungSungPos := Pos(Copy(tmp, 3, 2), EngJungSung);
    JongSungPos := Pos(Copy(tmp, 5, 2), EngJongSung);
    //
    If (ChoSungPos And JungSungPos And JongSungPos) = 0 Then Exit;
    ChoSung  := (ChoSungPos  - 1) Div 2;
    JungSung := (JungSungPos - 1) Div 2;
    JongSung := (JongSungPos - 1) Div 2;
    UniCode  := UniCodeHangeulBase +(ChoSung * 21 + JungSung) * 28 + JongSung;
    WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, @UniCode, 1, @tmp2, 2, nil, nil);
    Result   := tmp2[0]+tmp2[1];
end;

function CutFirstHangul(src:String):String;
var l : integer;
Begin
    l := Length(src);
    If l < 2 Then Result := src
    Else If (Length(DivChoJungJong(src)) <> 6 ) Then
            Result := src[1]
    Else If (l < 3)  Then Result := src
    Else If (Length(DivChoJungJong(Copy(src,1,2))) = 6 ) And (not CharKeyCheck(src[3])) Then
            Result := Copy(src,1,2)
    Else If (l < 4)  Then Result := src
    Else If (Length(DivChoJungJong(Copy(src,1,2))) = 6 ) And ((not CharKeyCheck(src[3])) or (Length(DivChoJungJong(Copy(src,3,2))) = 6)) Then
            Result := Copy(src,1,2)
    Else If (l < 5)  Then Result := src
    Else If (Length(DivChoJungJong(Copy(src,1,3))) = 6 ) And ((not CharKeyCheck(src[4])) or (Length(DivChoJungJong(Copy(src,4,2))) = 6)) Then
            Result := Copy(src,1,3)
    Else If (l < 6)  Then Result := src
    Else If (Length(DivChoJungJong(Copy(src,1,4))) = 6 ) And ((not CharKeyCheck(src[5])) Or (Length(DivChoJungJong(Copy(src,5,2))) = 6)) Then
            Result := Copy(src,1,4)
    Else    Result := Copy(src,1,5);
end;

function ConvEngToHan(src:String):String;
var  s,r,t : String;
Begin
    s := Src;
    r := '';
    If Trim(Src)<>'' Then Begin
       Repeat
          t :=     CutFirstHangul(s)  ;
          r := r + DecodingEngToHan(t);
          Delete(s,1,Length(t));
       Until s = '';
    End;
    Result := r;
end;

function HanDiv(const Han: PChar; Han3: PChar): Boolean;
var  UniCode: Word;
    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;
    JongSung := UniCode;
    StrLCopy(Han3,     Pchar(ChoSungTbl )  + ChoSung  * 2, 2);
    StrLCopy(Han3 + 2, Pchar(JungSungTbl)  + JungSung * 2, 2);
    StrLCopy(Han3 + 4, Pchar(JongSungTbl)  + JongSung * 2, 2);
    Result := True;
end;

function HanDivPas(const Src: String;Check:integer): String;
var  Buff: array[0..6] of Char;
    B,C:String ;
    i  :Integer;
begin
    B:='';
    C:='';
    For i:=1 To Length(Src) Do Begin
        B:=Copy(Src,((i-1)*2)+1,2);
        if Length(Trim(B))=2 then begin
           if HanDiv(PChar(B), Buff) then begin
              Buff[6]:=#0;
                   If Check=1 Then C :=C + Copy(String(Buff),1,2)
              Else If Check=2 Then C :=C + Copy(String(Buff),3,2)
              Else If Check=3 Then C :=C + Copy(String(Buff),5,2);
           end;
        end;
    End;
    HanDivPas:=C;
end;

Function GetHanType(const Src: string): Boolean;
var  Len, Hi, Lo: Integer;
begin
    Result := False;
    if Length(Src) < 2 then Exit;
    Len := Length(Src);
    Hi  := Ord(Src[Len - 1]);
    Lo  := Ord(Src[Len]);
    //if ($A1 > Lo) or ($FE < Lo) then Exit;
         if ($B0 <= Hi)  and ($C8 >= Hi) then Result := True   //한글
    Else if ($CA <= Hi)  and ($FD >= Hi) then Result := False  //한자
    Else                                      Result := False; //기타
end;


이 코드를 DelphiXE2에서 사용하려니 에러가 납니다.
에러메세지는
Incompatible types: 'PAnsiChar' and 'PWideChar'
이렇게 나오는데요.

수정 부탁드립니다.

공부가 잛아 죄송합니다.
공부 열심히 하겠습니다.

+ -

관련 글 리스트
16110 한글을 분해하고 조합하는 코드인데 수정 부탁드립니다. 첫눈 852 2020/05/21
16118     Re:한글을 분해하고 조합하는 코드인데 수정 부탁드립니다. 764 2020/06/11
16111     Re: 길게도 짰네요. C++17 테크닉으로 구현하면 757 2020/05/25
16112         Re:Re: 길게도 짰네요. C++17 테크닉으로 구현하면 빌더(TWx) 829 2020/05/25
16113             Re:Re:Re: 길게도 짰네요. C++17 테크닉으로 구현하면 질문 1006 2020/05/26
16114                 Re:Re:Re:Re: 길게도 짰네요. C++17 테크닉으로 구현하면 빌더(TWx) 1253 2020/05/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.