delphi

dkssudgktpdy를 안녕하세요로 변환

knoen 2013. 11. 19. 22:03


dkssudgktpdy를 안녕하세요로 변환하는 함수
홍환민
(손님) 
2000-12-31 오전 4:49:04
카테고리:강좌
1879회 조회
 


등록된 파일이 없습니다.
안녕하세요? 홍환민입니다.

'안녕하세요' 같은 한글 문자열을 'dkssudgktpdy' 같이 영어 입력상태로 놓고
'안녕하세요'를 친 것 같은 문자열로 변환하는 함수입니다.
이 소스 보시고 이해하시면 그 반대 기능도 쉽게 가능할 겁니다.
그리 무식한 방법을 쓴 함수는 아니므로 도움이 될 겁니다.
아참 그리고 부록으로 문장의 글자를 역순으로 변환하는 함수도 있습니다.
안녕하세요 -> 요세하녕안 이렇게요.
(소스에 같이 들어있어서 그냥 같이 올립니다.)

한글 한 글자씩 접근하기 위해 WideString 형을 사용했습니다.
WideString을 사용하면 영어든 한글이든 문자열의 인덱스(참조인자) 하나가
각 한 글자를 참조하게 됩니다. 'a안bcd' 이렇게 된 WideString형의 문자열 str가
있다면 str[1]은 'a' str[2]는 '안' str[3]은 'b'... 이런 식이 되니 편합니다.

First := (High and (64+32+16+8+4)) shr 2;
위와 같은 문장은 이해하기 쉽도록 하기 위해 저렇게 했으니까 좀 손 보세요.

uses절에 있는 CodeConv라는 소스는 완성형->조합형 변환루틴이 있는 소스입니다.
여덕수 님이나 이유정 님이 공개하신 훌륭~한 소스가 이 곳(델마당) 자료실에
있습니다.

흠 나머지는 소스를 보시면 이해가 갈거에요.
조금이라도 도움이 됐으면.. ^^ 워낙 초보적인거라..
자 그럼 소스 갑니다..
--------------------------------------------------------------------------------

unit StrConvert;

interface

function ConvertHanToEng(Str: string): string;
function ReverseString(Str: WideString): WideString;

implementation

uses
CodeConv;

const
EngTable: array[1..3] of array[0..31] of string = (
(#0, #0, 'r', 'R', 's', 'e', 'E', 'f', 'a', 'q', 'Q', 't', 'T', 'd', 'w', 'W', 'c', 'z', 'x', 'v', 'g', #0, #0, #0, #0, #0, #0, #0, #0, #0, #0, #0), // 초성
(#0, #0, #0, 'k', 'o', 'i', 'O', 'j', #0, #0, 'p', 'u', 'P', 'h', 'hk', 'ho', #0, #0, 'hl', 'y', 'n', 'nj', 'np', 'nl', #0, #0, 'b', 'm', 'ml', 'l', #0, #0), // 중성
(#0, #0, 'r', 'R', 'rt', 's', 'sw', 'sg', 'e', 'f', 'fr', 'fa', 'fq', 'ft', 'fx', 'fv', 'fg', 'a', #0, 'q', 'qt', 't', 'T', 'd', 'w', 'c', 'z', 'x', 'v', 'g', #0, #0) // 종성
);

{--------------------------------------------------------------------------
한글 문장을 영문입력상태에서 친 문장으로 변환한다.
예) 안녕하세요 -> dkssudgktpdy
--------------------------------------------------------------------------}
function ConvertHanToEng(Str: string): string;
var
I : Integer;
High, Low : Byte;
First, Middle, Last : Byte;
begin
Result := '';
I := 1;

// 완성형 -> 조합형 변환
Convert_Text( Str, W2J );

while I <= Length(Str) do
if Byte(Str[I]) > 127 then
begin
High := Byte(Str[I]);
Low := Byte(Str[I+1]);

// High Low
// ---------- ---------
// O|OOOOO|OO OOO|OOOOO
// ~~~~~ 이렇게 초성 부분을 뽑아온다.
First := (High and (64+32+16+8+4)) shr 2;
// High Low
// ---------- ---------
// O|OOOOO|OO OOO|OOOOO
// ~~~~~~ 이렇게 중성 부분을 뽑아온다.
Middle := ( (High and (2+1)) shl 3 )
+ ( (Low and (128+64+32)) shr 5 );
// High Low
// ---------- ---------
// O|OOOOO|OO OOO|OOOOO
// ~~~~~ 이렇게 종성 부분을 뽑아온다.
Last := Low and (16+8+4+2+1);

Result := Result + EngTable[1][First];
Result := Result + EngTable[2][Middle];
if EngTable[3][Last] <> #0 then
Result := Result + EngTable[3][Last];

Inc(I, 2);
end
else
begin
Result := Result + Str[I];
Inc(I);
end;
end;


{--------------------------------------------------------------------------
한글 문장의 글자순을 역순으로 변환한다.
예) 가는 말이 고와야 오는 말이 곱다. -> .다곱 이말 는오 야와고 이말 는가
--------------------------------------------------------------------------}
function ReverseString(Str: WideString): WideString;
var
I : Integer;
begin
Result := '';
for I := Length(Str) downto 1 do
Result := Result + Str[I];
end;


end.

'delphi' 카테고리의 다른 글

WebBrowser에서 window.open 구별방법  (0) 2013.12.28
How can I force a drop-down combo to drop its list down?   (0) 2013.12.25
handling dblclicked string_grid cell  (0) 2013.05.23
한글 자소  (0) 2013.01.01
IE toolbar , backspace  (0) 2012.12.02