이 소스는 조준래님 홈 에서 참고하였습니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function HanDiv(const Han:PChar;Han3:PChar):Boolean;
function HanDivPas(const Src:String):String;
public
{ Public declarations }
end;
const
ChoSungTbl: PChar = 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ';
JungSungTbl:pchar = 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ';
JongSungTbl:pchar = 'ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ';
UniCodeHangeulBase = $AC00;
UniCodeHangeulLast = $D79F;
var
Form1: TForm1;
implementation
{$R *.DFM}
function TForm1.HanDiv(const Han:PChar;Han3:PChar):Boolean;
var
UniCode:integer;
ChoSung,jungsung,jongsung:integer;
begin
Result := False;
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;
// 1번 주석 JongSung := UniCode;<-여기 주석을 풀면 UniCode에 터무니 없는 데이터가 넘어옴.
strLCopy(Han3,ChoSungTbl + ChoSung * 2,2);
StrLCopy(Han3 + 2,JungSungTbl + JungSung * 2,2);
StrLCopy(Han3 + 4,JongSungTbl + jongsung * 2,2);//jongsung 값이 계산 된 값이 아
//니기 때문에 초성 중성은 맞게 나오는데 종성값이 틀림.
Result:= True;
end;
function TForm1.HanDivPas(const Src:String):String;
var
Buff:array[0..6] of char;
begin
result :='';
if Length(Src) = 2 then begin
if HanDiv(PChar(Src),Buff) then begin
Buff[6]:= #0;
Result:= String(Buff);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strout:string;
begin
//string:= edit1.text;
strout :=hanDivPas(Edit1.Text);
edit2.Text:=strout;
end;
end.
위에 주석을 달았듯이. '강' 이란 한글을 입력하고 버튼을 누르면 ㄱㅏㅇ이런식으로 분해 되어야 하는데 종성값이 이상하게 됩니다.
1번 주석을 풀면 UniCode에 넘어오는 값이 전혀 이상한 값으로 넘어 옵니다.
이 문제를 해결해 주시면 정말 감사하겠습니다.
안녕하세요?
본 소스에서 크게 잘못된 부분은 없습니다.
이 소스는 그대로 사용하면 님의 말씀처럼 에러가 나오는군요...
이렇게 수정하세요.
제가 유니코드(한글)를 조사해서 소스와 대조해보니까, 특별히 잘못된 부분은 없고요,
종성계산에서 삐끗했군요...
function TForm1.HanDiv(const Han:PChar; Han3:PChar):Boolean;
var
UniCode:integer;
ChoSung,jungsung,jongsung:integer;
begin
Result := False;
Unicode := 0 ; // 반드시 필요
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-1; // -1를 해주어야 정확한 것임
strLCopy(Han3,ChoSungTbl + (ChoSung * 2) ,2);
StrLCopy(Han3 + 2,JungSungTbl + (JungSung * 2),2);
StrLCopy(Han3 + 4,JongSungTbl + (jongsung * 2),2);
Result:= True;
end ;
이상입니다. Handiv함수만 위처럼 수정해주시면 됩니다.
그럼...