Q&A

  • 한글 분리가 안되네요.
한글이 분리가 안되네요.
테스트 한번 해주세요.

『델파이 동호회-팁 (go delphif)』
[43] 제 목 : [팁] 델파이에서 한글 조합과 분리.
올린이 : 장미정(jwsea) 등록시각:98-11-11 11:34:55 읽음 : 114 받음 : 0
관련자료 없음
--------------------------------------------------------------------------
델마당홈의 권순종님의 팁입니다.

코드에 앞서 잠깐 설명하자면 다음 코드에는 두가지 함수가 있습니다.

1. HanDiv
2. HanCom

HanDiv는 '강'을 'ㄱㅏㅇ'으로 변환하는 함수이며 HanCom은 그 반대입니다.
각 함수의 파라메터인 Han, Han3는 각각 한글의 한 글자, 그리고 초,중,종성
으로 나누
어진 글자들입니다. Han은 최소
2바이트, Han3은 6바이트의 메모리가 할당되어 있어야 합니다.
(함수내에서는 null-terminated처리를 하지 않습니다.)

-------코드--------

// Programmed by Jounlai Cho (khouse@nuri.net)
// April 17, 1998

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

';
// ^^요기는 꼭 2칸을 띄어야 합니다.


UniCodeHangeulBase = $AC00;
UniCodeHangeulLast = $D79F;

function HanDiv(const Han: PChar; Han3: PChar): Boolean;
var
UniCode: Integer;
ChoSung, JungSung, JongSung: Integer;
begin
Result := False;
// if StrLen(Han) < 2 then Exit;

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, ChoSungTbl + ChoSung * 2, 2);
StrLCopy(Han3 + 2, JungSungTbl + JungSung * 2, 2);
StrLCopy(Han3 + 4, JongSungTbl + JongSung * 2, 2);

Result := True;
end;

function HanCom(const Han3: PChar; Han: PChar): Boolean;
var
UniCode: Integer;
ChoSung, JungSung, JongSung: Integer;
ChoSungPos, JungSungPos, JongSungPos: Integer;
begin
Result := False;
// if StrLen(Han3) < 6 then Exit;

ChoSungPos := Pos(Copy(String(Han3), 1, 2), ChoSungTbl);
JungSungPos := Pos(Copy(String(Han3), 3, 2), JungSungTbl);
JongSungPos := Pos(Copy(String(Han3), 5, 2), JongSungTbl);

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, Han, 2, nil, nil);

Result := True;
end;

-------코드 끝---------

참고로 이 함수를 불러 쓰는 예제를 보내드립니다.

-------코드----------

procedure TForm1.Button1Click(Sender: TObject);
var
Dest: array[0..6] of Char;
begin
if HanDiv(PChar(Edit1.Text), @Dest) then begin
Dest[6] := Char(0);
Edit2.Text := String(Dest);
end else
Edit2.Text := '?';

end;

procedure TForm1.Button2Click(Sender: TObject);
var
Dest: array[0..2] of Char;
begin
if HanCom(PChar(Edit1.Text), @Dest) then begin
Dest[2] := Char(0);
Edit2.Text := String(Dest);
end else
Edit2.Text := '?';
end;

-------코드 끝--------

1  COMMENTS
  • Profile
    김수경 2003.04.23 21:01
    Windows 2000에서 Test해 봤는데
      MultiByteToWideChar()
    실행후 결과가 32 Bit로 나와
      if (UniCode < UniCodeHangeulBase) or
      (UniCode > UniCodeHangeulLast) then Exit;
    조건에 걸려 함수를 종료하더군요.
    추가할 부분을 ***** 로 표시해 두었으니
    확인해 보세요.(참고로 제 PC에 Delphi가 설치 안된 관계로 아래 Source를 직접 테스트하진 못했습니다 -.-;)
    즐푸하세요


                         //12  <- 윗 줄 'ㄱ' 앞에 공백이 2개 있어야 합니다. *****

    UniCode = UniCode and $FFFF; // <--- 이 줄을 추가하세요. *****