function DivHan(Han : String) : String;
const
CTbl: WideString = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ';
JTbl: WideString = 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ';
JoTbl: WideString = ' ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ';
var
i : Integer;
Temp : WideString;
WC : Integer;
c, j, jo : Integer;
begin
Temp := Han;
for i := 1 to Length(Temp) do
begin
WC := Ord(Temp[i]) - $AC00;
c := WC div (21 * 28);
j := (WC Mod (21 * 28)) div 28;
jo := WC mod (21 * 28) mod 28;
Result := Result + CTbl[c + 1] + JTbl[j + 1] + JoTbl[jo + 1];
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//
Edit2.Text := DivHan(Edit1.Text);
end;
sunkey 님이 쓰신 글 :
: 방법은
: 한글을 자모음으로 변환한 다음
: 이 자음과 모음을 영문으로 변환할려고 합니다.
: 그런데 한글 분리가 안되네요.
: 코드 보시고 하시는 분 계시면 답변 부탁드립니다.
:
: 델마당홈의 권순종님의 팁입니다.
:
: 코드에 앞서 잠깐 설명하자면 다음 코드에는 두가지 함수가 있습니다.
:
: 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;
:
: -------코드 끝--------
:
:
|