안녕하세요? 홍환민입니다.
'안녕하세요' 같은 한글 문자열을 '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.
|