한글입력시 만약
exe) '한메일'이라고 입력시 'ㅎ'을 가져오고 싶습니다 그리고 'ㅎ'을 가져와서 '하'로 치환할려고 합니다
'까마귀' 라고 입력해도 '가'로 치환하는 것이죠
'빵구' 라고 입력해도 '바'로 치환, 즉 처음 입력되는 한글키를 잡아서 가,나,다,라,마,바,사......로 만들려는 것이죠
어떤방법이 있을까여 꼭 좀 부탁합니다
나의 머리에 한계는 이렇게도 빨리 오는군여...흑흑 3일밤을 지샌 후 올립니다....
꼭좀 처방을 내려주세염...
> 한글입력시 만약
> exe) '한메일'이라고 입력시 'ㅎ'을 가져오고 싶습니다 그리고 'ㅎ'을 가져와서 '하'로 치환할려고 합니다
> '까마귀' 라고 입력해도 '가'로 치환하는 것이죠
> '빵구' 라고 입력해도 '바'로 치환, 즉 처음 입력되는 한글키를 잡아서 가,나,다,라,마,바,사......로 만들려는 것이죠
>
> 어떤방법이 있을까여 꼭 좀 부탁합니다
> 나의 머리에 한계는 이렇게도 빨리 오는군여...흑흑 3일밤을 지샌 후 올립니다....
>
> 꼭좀 처방을 내려주세염...
제가 도움이 될만한 것을 찾아서 올립니다. 이것을 참조하시면 나을거여요!
그럼 얀님 파이팅!
코드에 앞서 잠깐 설명하자면 다음 코드에는 두가지 함수가 있습니다.
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;
-------코드 끝--------
bye~
--------------------------------------------------------------------------