BaseHangul 1.1

BaseHangul은 한글을 이용한 바이너리 인코딩입니다. 바이너리 데이터를 KS C 5601 규격에 포함된 한글 문자로 변환합니다.

I. 변환 방식

5바이트(40비트)가 4글자가 됩니다.

왜 40비트인가?

KS C 5601에 포함된 한글 조합은 총 2350자이므로 순수한 한글 문자만을 이용해서 11비트를 한 글자로 표현할 수 있습니다. 하지만 11비트를 한 문자로 조합하면 8(1바이트)과의 최소공배수가 88인 관계로 변환 최소 단위가 88비트가 되어 낭비가 심해집니다. 그래서 1028개의 문자만을 선별하여 10비트를 한 글자로 표현하기로 했습니다. 따라서 변환 최소 단위는 8과 10의 최소공배수인 40비트가 됩니다.

사용되는 조합은?

KS C 5601 조합 중 사전순으로 앞에서부터 1028개의 조합만을 사용합니다. "흐"의 경우 범위 밖에 있습니다만, padding 문자로 사용됩니다.

II. 예제

예제 1: 5바이트를 채운 경우

바이트 문자1 (49)2 (50)3 (51)a (97)b (98)
비트 값 00110001 00110010 00110011 01100001 01100010
10비트 문자 꺽 (196)먹 (803)꼍 (216)녜 (354)

예제 2: 5바이트를 채우지 못한 경우

바이트 문자1 (49)
비트 값 00110001 00000000 00000000 00000000 00000000
10비트 문자 꺽 (196)흐 (-1)흐 (-1)흐 (-1)

중간에 잘린 경우 0으로 padding하며, 10비트째로 padding일 경우 NULL문자 "가" 대신 padding 문자 "흐"를 출력합니다.

예제 3: 마지막 40비트가 5바이트째 없이 끝난 경우

바이트 문자1 (49)2 (50)3 (51)d (100)
비트 값 00110001 00110010 00110011 01100100 00000000
10비트 문자 꺽 (196)먹 (803)꼐 (217)빎 (1024)

5바이트째 없이 끝난 경우 인코드 후 디코드하면 원래는 없었던 NULL이 붙어 나오기 때문에 예외로 지정하였습니다.

마지막 10비트를 8만큼 오른쪽으로 시프트한 후 1024를 더해주면 됩니다.

III. 구현예제

PHP로 구현해두었습니다.

https://github.com/koreapyj/basehangul