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
[8768] 한글이 분리가 안되네요. 확인좀 해주세요.
sunkey [sunkey] 1267 읽음    2003-04-22 22:07
방법은
한글을 자모음으로 변환한 다음
이 자음과 모음을 영문으로 변환할려고 합니다.
그런데 한글 분리가 안되네요.
코드 보시고 하시는 분 계시면 답변 부탁드립니다.

델마당홈의 권순종님의 팁입니다.

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

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;

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


+ -

관련 글 리스트
8768 한글이 분리가 안되네요. 확인좀 해주세요. sunkey 1267 2003/04/22
8770     Re:한글이 분리가 안되네요. 확인좀 해주세요. 김성규 1046 2003/04/23
8771         Re: 김성규님 너무너무 감사합니다. sunkey 732 2003/04/24
8773             Re:Re: 김성규님 너무너무 감사합니다. - 그냥 참고 서경철 859 2003/04/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.