한글이 분리가 안되네요.
테스트 한번 해주세요.
『델파이 동호회-팁 (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;
-------코드 끝--------
MultiByteToWideChar()
실행후 결과가 32 Bit로 나와
if (UniCode < UniCodeHangeulBase) or
(UniCode > UniCodeHangeulLast) then Exit;
조건에 걸려 함수를 종료하더군요.
추가할 부분을 ***** 로 표시해 두었으니
확인해 보세요.(참고로 제 PC에 Delphi가 설치 안된 관계로 아래 Source를 직접 테스트하진 못했습니다 -.-;)
즐푸하세요
//12 <- 윗 줄 'ㄱ' 앞에 공백이 2개 있어야 합니다. *****
UniCode = UniCode and $FFFF; // <--- 이 줄을 추가하세요. *****