Naver Perl Community & Study Cafe


2008.12.01 00:55

한글 문자열을 키보드 자판의 영문자로 변환


예전 WIn32::GuiTest 모듈을 사용한 예제에서

영문만 지원이 되고 한글은 지원되지 않기에

한글문자열이 직접 영문타자로 변환되는 모듈을 만들어 볼까 생각했었다.


오늘 시간이 남아 일단 여러 자료들을 다 펼쳐놓고 작업에 들어갔는데...


크게 정리하자면

1. 한글 문자열을 각 문자단위로 조각조각 낸다.
2. 조각조각 낸 단위의 문자들을 각각 영문키로 바꾼다.
3. 끝(?)....


응?? 어떻게 보면 간단하다... 

하지만 세부적으로 들어가야하는 코딩은 까다롭기 때문에

잘 생각해보자.


가장먼저 한글을 쪼개어서 각 문자코드로 변환시켜주는 모듈을 소개한다.

Lingua::KO::Hangul::Util

utility functions for Hangul in Unicode 
Lingua-KO-Hangul-Util-0.23 - 05 Jun 2007 - SADAHIRO Tomoyuki 

이 유익한 모듈은... 일본사람이 만들었다.. 쳇...

모듈을 통해 간단한 테스트 코드를 만들어 테스트를 해보았다.

각 모듈을 조각조각 내는것은 어렵지 않게

decomposeSyllable 함수를 쓰면 조각 내어진다.




이 모듈을 가지고 얼마전 a3r0님이 

이름을 서로 매칭시켜 궁합을 보는 프로그램을 만든 적이 있었다.


그래서 이 모듈을 조금만 수정하면 각각의 문자값에 영문자를 넣어

변형할 수 있을 것이란 생각이 들었다.




이 모듈은 decomposeJamo 라는 함수를 제공하는데

이 함수는 ㄲ(&#x1101) 을 ㄱ(&#x1100)ㄱ(&#x1100) 으로 나누어준다.

ㄲ을 자판의 키로 옮길때는 대문자 R이 되어야 하는데...

rr(소문자r2개) 으로 바꿔서 처리하니 변환하기가 곤란했다.

그렇다고 decomposeJamo 함수를 안쓰려니...

종성에서 ㄳ 을 ㄱ 과 ㅅ으로 ㄺ 을 ㄹ 과 ㄱ으로

나누어주는 편리함때문에 이 모듈을 안 쓸 수도 없었다.


진퇴양난...


일단 나만의 함수를 만들기에 아직 실력이 출중하지 않고...

결국 이 모듈을 내가 편하게 고쳐서 사용하기로 하였다.

decomposeJamo 함수를 사용하되

쌍자음과 ㅐ,ㅒ,ㅖ ,ㅔ 같은 모음들은 변환이 안되게 변환되는 부분에서

주석처리를 해버리는 방법이었다.

나중에야 발견했지만

종성에서 ㄲ 과 ㅆ 도 변환되지 않게 처리해야 한다는 것을 알았다.

그래서 이렇게 변환해주는 모듈을 완성을 해보았다.



Hangle.pm

package Hangle;

use strict;
use warnings;
use Lingua::KO::Hangul::Util qw(:all);
use base qw/Exporter/;
use Encode qw/decode encode/;

our @EXPORT_OK = qw/transformation/;

sub transformation{
	my $arg = shift;
	my $str = decode('cp-949', $arg);
	binmode STDOUT, ':encoding(cp-949)';
	my %hangle = (
			#초성
			"\x{1100}" => 'r', "\x{1102}" => 's', "\x{1103}" => 'e', "\x{1105}" => 'f',  # ㄱㄴㄷㄹ
			"\x{1106}" => 'a', "\x{1107}" => 'q', "\x{1109}" => 't', "\x{110B}" => 'd',  # ㅁㅂㅅㅇ
			"\x{110C}" => 'w', "\x{110E}" => 'c', "\x{110F}" => 'z', "\x{1110}" => 'x',  # ㅈㅊㅋㅌ
			"\x{1111}" => 'v', "\x{1112}" => 'g', "\x{1101}" => 'R', "\x{1104}" => 'E',  # ㅍㅎㄲ ㄸ
			"\x{1108}" => 'Q', "\x{110A}" => 'T', "\x{110D}" => 'W',                     # ㅃ ㅆ ㅉ		  
			#중성
			"\x{1161}" => 'k', "\x{1163}" => 'i', "\x{1165}" => 'j', "\x{1167}" => 'u',  # ㅏㅑㅓㅕ
			"\x{1169}" => 'h', "\x{116D}" => 'y', "\x{116E}" => 'n', "\x{1172}" => 'b',  # ㅗㅛㅜㅠ
			"\x{1173}" => 'm', "\x{1175}" => 'l',                                        # ㅡㅣ
			"\x{1162}" => 'o', "\x{1164}" => 'O', "\x{1166}" => 'p', "\x{1168}" => 'P',  # ㅐㅒㅔㅖ
			#종성
			"\x{11A8}" => 'r', "\x{11AB}" => 's', "\x{11AE}" => 'e', "\x{11AF}" => 'f',  # ㄱㄴㄷㄹ
			"\x{11B7}" => 'a', "\x{11B8}" => 'q', "\x{11BA}" => 't', "\x{11BC}" => 'd',  # ㅁㅂㅅㅇ
			"\x{11BD}" => 'w', "\x{11BE}" => 'c', "\x{11BF}" => 'z', "\x{11C0}" => 'x',  # ㅈㅊㅋㅌ
			"\x{11C1}" => 'v', "\x{11C2}" => 'g',                                        # ㅍㅎ
			"\x{11A9}" => 'R', "\x{11BB}" => 'T',                                        # ㄲ ㅆ
			#특수문자
			"\x{20}" => ' ' , "\x{A}" => "\n" , "\x{2E}" => '.' , "\x{2C}" => ',' ,      #Space Enter . ,
			"\x{2D}" => '-' , 
			#Number
			"\x{30}" => '0' , "\x{31}" => '1' , "\x{32}" => '2' , "\x{33}" => '3' ,
			"\x{34}" => '4' , "\x{35}" => '5' , "\x{36}" => '6' , "\x{37}" => '7' ,
			"\x{38}" => '8' , "\x{39}" => '9' ,
	);
	my @jamos =  map { split //, decomposeJamo($_) }split //, decomposeSyllable($str);
	my $keys = '{HAN}';
	foreach (@jamos) { $keys .= $hangle{$_} }
	# print "$strokes";
	return $keys;
}

http://codepad.org/Wa3a4asO


특수문자는 필요한 문자들은 더 추가할 계획이다.

어렵게 한글변환을 끝내고 GuiTest 모듈에 적용시켜 테스트 하려고 하니...

한/영 키의 코드를 모르는 것이다.................




처음에 생각했을 때 외국사람들이 한영키를 배려해놨을리가 없지... 생각하고

키 테스트 프로그램을 몇개 켜놓고 한영키를 꾹꾹 눌러가면서 한영키 값을 찾아보고 있었다.

그렇게 삽질을 하다가 혹시나 해서 GuiTest 모듈을 다시 세부적으로 분석해 보았는데,

GuiTest.pc 파일을 보니 이러한 코드를 확인할 수 있었는데....

1
2
3
4
5
6
7
sub VK_KANA           { 0x15; }
sub VK_HANGEUL        { 0x15; }
sub VK_HANGUL         { 0x15; }
sub VK_JUNJA          { 0x17; }
sub VK_FINAL          { 0x18; }
sub VK_HANJA          { 0x19; }
sub VK_KANJI          { 0x19; }

오.. 이럴수가... 한글에 대해서... 배려를 해 놓았다..

다른나라 사람들도 활용 할 수 있도록 모듈을 설계한

그들의 이식성에 감탄할 수 밖에 없다.


이제 키가 정의된 코드에서 한글 키만 추가하면 한영키를 사용할 수 있다.
 

my %vk = ( 

    ..... 

HAN    => VK_HANGUL(),

 

);


해쉬를 추가한 뒤 간단한 테스트 프로그램을 짜봤다.

Han_Trans.pl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use warnings;    
use Win32::GuiTest;
use Hangle qw/transformation/;
my $key = "글쓰기는 근육과 같습니다.\n".
"더 많이 쓸수록 더 잘 쓸 수 있게 됩니다.\n".
"글을 잘 못쓴다면 간단한 일기를 쓰고, \n".
"블로그도 만들어보고, 창조적인 쓰기 수업을 수강하고, \n".
"4년동안 티격태격 싸워왔던 대학동기나 룸메이트에게 보내는 \n".
"멋진 편지를 써보세요 \n".
"어떤 글이라도 종이에 적기 시작하면 글쓰는 기술이 향상될 겁니다.\n\n".
" - 조엘 온 소프트웨어 \n";
$key = transformation($key);
# print $key;
system("start notepad.exe");
sleep 1;
Win32::GuiTest::SendKeys($key);
sleep 5;
Win32::GuiTest::SendKeys("%{F4}{TAB}{ENTER}");

http://codepad.org/HoxMNqeY


컴파일해서 실행파일까지 만들었으나

이 실행파일은 컴파일 당시 환경과  윈도우 버전이 틀리면 실행되지 않는다.

그리고 3MB 정도로 꾀 큰 용량을 차지하며

패킹을 해봤더니 콘솔창에서 오류가 뜬다. ( 그러면서 실행은 되었다는...)

코드안에 한글이 들어가 있을 경우 컴파일도 안되는 어이없는 일도 생겨...

PAR::Packer 모듈도 조금 더 발전했으면 한다.




- 참고

The Korean Writing System
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 2 Comment 4


티스토리 툴바