Python: 3327 N바이트 한글을 UTF-8 및 KS 완성형으로 변환
Apple2 시절엔 한글 소프트웨어도 귀했지만 일부 있다 하더라도 3327한글이란 N바이트 조합형 한글을 사용했었다. 그걸 도트 프린터로 보내면 한글 모듈이 달려 있는 프린터들(주로 엡슨 호환기종들)이 한글을 인식해서 자체 한글 폰트로 출력을 해 줬었다.
그런 도트프린터 감성의 추억 때문에 도트 프린터 에뮬레이션 코드도 작성했는데, 문제는 3327 한글을 조합형으로 바꾸는 과정에서 어려움이 있었다. 일단 AppleWin 으로 출력을 파일로 보내서 3327 한글 N바이트 조합형 코드를 확보하는 것 까지는 쉬운데 이걸 TG 삼보 조합형으로 바꿔줘야 비트맵 그래픽 폰트를 사용할 수 있게끔 코드 테이블의 포인터들을 쉽게 결정할 수 있다. 그런데 바로 삼보 조합형으로는 도저히 못하겠고, 일단 KS 완성형으로 바꾸면 예전 도스 시절에도 쓰던 KS 완성형 - TG 조합형 변환 C 코드를 현 윈도우즈의 프롬프트 모드에서도 돌아가는 Borland C++ 5.5 커맨드라인 컴파일러로 32비트 실행파일로 컴파일해서 사용했었는데, 이 부분은 며칠전 결국 파이썬으로 다 대체할 수 있었다.
그런데 남은 문제는 3327 한글을 KS 완성형으로 바꾸는 것. 10여년 전에도 이 짓을 했었는데, 그때는 크롬 브라우저에 한글 오토마타 익스텐션이 있어서 덕을 봤었지만, 이제는 그 익스텐션이 사라지고 없다. 결국 꼼수를 찾은 것이 3327 한글의 경우 자모 순서대로 알파벳이 나열되어 있는 구조라 (한글 영어 전환을 위한 컨트롤 문자가 앞뒤에 붙는다. Ctrl-K 는 한글로 전환, Ctrl-A 는 영어로 전환) 그 알파벳 대로 (몇몇 복모음과 쌍자음만 기호키인 것을 잘 바꿔주는 조건 하에) 윈도우즈 노트패드에 키 입력을 해 주면 그대로 한글 입력이 된다. 이를 위해서 pyautogui 키 미케닉 라이브러리를 사용해서 마치 사람이 손으로 타자치듯 노트패드에 입력을 시켜 버리는 것으로 해결했었다. 타자가 끝나면 저장할때 그냥 저장하면 디폴트인 UTF-8 포맷이 되고, 강제로 ANSI 포맷으로 하면 예전에 쓰던 KS 완성형으로 된다.
그런데 이것도 생각보다 느리고 답답하게 여겨져서 직접 프로그램으로 해결할 방법을 찾던 중 jamo 라는 라이브러리와 hangul-utils 라는 라이브러리를 알게 되어 jamo 의 경우 완성형 (실제로는 UTF-8) 한글을 자모 분리를 해서 조합형으로 변환하는데 잘 사용했고, hangul-utils 라는 라이브러리는 풀어쓴 자모를 다시 모아주는데 이용할 수 있음을 알게 되서 한글 입력을 문자 조합으로 만드는 간이 오토마타를 만들어 봤다. 역시 UTF-8 기반의 파이썬 3를 사용하니 모든 자모 테이블을 문자들로 만들어서 위치 검색만으로 룩업테이블 처럼 쓸수 있다보니 너무 너무 편리하다.
일단 사용한 라이브러리 출처
https://github.com/kaniblu/hangul-utils
이번 작업에서는 마스터를 다 받아서 압축을 푼 후 unicode.py 만 가져다 쓰면 충분하다.
만든 코드와 실행 사례들은 압축해서 첨부.
실행하면 AppleWin 에서 프린팅을 덤프한 3327 한글 출력 파일명을 묻고, 처리 후 ANSI KS 완성형 결과와 (.ks.txt 가 뒤에 붙음), utf-8 포맷의 결과 (.utf8.txt 붙음) 두 파일로 저장해준다. 파이썬 3에서 사용할때의 차이라면 ks 는 그냥 ANSI 텍스트 파일처럼 오픈해서 읽으면 되고, utf8 은 open(filename, encoding='utf-8') 만 해 주면 된다.
다음은 도트 프린터 에뮬레이터 업데이트 버전에서 utf-8 과 ansi ks 두 경우에 다르게 파일을 오픈하는 예이다.
역시 도트프린터 에뮬레이션도 작업 결과를 첨부.
엡슨 도트프린터 그래픽 출력 에뮬레이션도 폴더 정리 (작업 영역은 배치파일 두개만 남기고, 실제 코드는 prog 폴더로 보낸) 를 한 버전으로 한번 더 첨부.
이걸로 엡슨 도트프린터 그래픽 프린트 에뮬레이션과 ansi ks 완성형 또는 utf-8 완성형 한글을 TG 조합형으로 변환하는 것을 포함해서 애플2 관련 도트프린터의 추억과 관련한 작업은 거의 마무리했다는 생각이 든다.
---------
추가로 mame 에서 텍스트 프린트 하는 것을 파일로 덤프할 경우 최상위비트가 1로 셋팅이 되서 나오기에 AppleWin 의 것처럼 바로 쓸수가 없다. 바로 사용하더라도 이탤릭체와 몇몇 라인 넘김 등이 깨지고 제대로 처리가 안된다. 그런 경우를 위해 상위비트만 리셋하는 프로그램을 만들어봤고 잘 작동함을 확인했다.