Coding/Python Matlab

Python: 3327 N바이트 한글을 UTF-8 및 KS 완성형으로 변환

smores 2023. 12. 8. 11:48

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

 

GitHub - kaniblu/hangul-utils: An integrated library for Korean language preprocessing.

An integrated library for Korean language preprocessing. - GitHub - kaniblu/hangul-utils: An integrated library for Korean language preprocessing.

github.com

 

이번 작업에서는 마스터를 다 받아서 압축을 푼 후 unicode.py 만 가져다 쓰면 충분하다. 

 

만든 코드와 실행 사례들은 압축해서 첨부.

jamo_3327_to_UTF8-kor_1207.zip
0.06MB

 

실행하면 AppleWin 에서 프린팅을 덤프한 3327 한글 출력 파일명을 묻고, 처리 후 ANSI KS 완성형 결과와 (.ks.txt 가 뒤에 붙음), utf-8 포맷의 결과 (.utf8.txt 붙음) 두 파일로 저장해준다. 파이썬 3에서 사용할때의 차이라면 ks 는 그냥 ANSI 텍스트 파일처럼 오픈해서 읽으면 되고, utf8 은  open(filename, encoding='utf-8') 만 해 주면 된다.

 

다음은 도트 프린터 에뮬레이터 업데이트 버전에서 utf-8 과 ansi ks 두 경우에 다르게 파일을 오픈하는 예이다.

 

 

역시 도트프린터 에뮬레이션도 작업 결과를 첨부.

 

jamo_3327_to_UTF8-kor_1207.zip
0.06MB

 

 

엡슨 도트프린터 그래픽 출력 에뮬레이션도 폴더 정리 (작업 영역은 배치파일 두개만 남기고, 실제 코드는 prog 폴더로 보낸) 를 한 버전으로 한번 더 첨부.

 

Epson Dot Printer Emulation 1207.zip
13.80MB

 

 

이걸로 엡슨 도트프린터 그래픽 프린트 에뮬레이션과 ansi ks 완성형 또는 utf-8 완성형 한글을 TG 조합형으로 변환하는 것을 포함해서 애플2 관련 도트프린터의 추억과 관련한 작업은 거의 마무리했다는 생각이 든다. 

 

---------

추가로 mame 에서 텍스트 프린트 하는 것을 파일로 덤프할 경우 최상위비트가 1로 셋팅이 되서 나오기에 AppleWin 의 것처럼 바로 쓸수가 없다. 바로 사용하더라도 이탤릭체와 몇몇 라인 넘김 등이 깨지고 제대로 처리가 안된다. 그런 경우를 위해 상위비트만 리셋하는 프로그램을 만들어봤고 잘 작동함을 확인했다.

 

mame_text_prn_dump_bit8.py
0.00MB