E,AHRSS

한컴 2바이트 코드

last modified: 2015-01-30 09:39:16 Contributors


Contents

1. 개요
2. 구성
2.1. 특수 문자
2.2. 한글
2.2.1. 완성형 옛한글의 버그
2.3. 한자
2.3.1. 2수준 한자 ↔ 유니코드 변환 시 주의할 점


1. 개요

한글과컴퓨터아래아 한글 2.0(1992년)에서부터 한/글 97까지 쓰였던 코드 체계. 이후 한/글 워디안부터는 유니코드를 채택하면서 더 이상 쓰이지 않게 되었다.

2. 구성

기본적인 구성은 다음과 같다. [1]
문자 영역 시작문자 영역 끝문자 영역 이름
000003FF로마자 (확장 로마자 포함)
040004FF국제 음성 기호 (IPA)
050006FF그리스 문자
070007FF키릴 문자
08000AFF브리 문자
0B001BFF(예비 영역)
1C001CFF음 부호
1D001EFF구결
1F001FFF가나
2000217F수학식 기호 (일반)
218021FF수학식 기호 (화살표)
220023FF수학식 기호 (집합)
240024FF(예비 영역)
250025FF기타 기호
26002AFF(예비 영역)
2B002DFF사전용 약물
2E002EFF 문자 조각
2F002FFF불렛 기호
3000307F반각 기호 ()
3080329F반각 기호 (도형)
32A032DF반각 가나
330033FF키 캡
3400357F전각 기호 (일반)
358035FF전각 기호 (로마자)
3600367F전각 기호 (선/단위)
368036FF전각 기호 (원)
3700377F전각 기호 (괄호)
378037FF전각 기호 (기타)
38003BFF사용자 정의 (반각)
3C003FFF사용자 정의 (전각)
40005317한자 (제1수준)
53187FFF한자 (제2수준)
8000FFFF한글
중간에 '예비 영역'이라고 표시된 곳은 문자를 배당하지 않고 비워 둔 곳을 말한다. 이들 영역은 워디안에서부터 유니코드의 채택으로 인해 한컴 2바이트 코드가 사장되는 바람에 영원히 비워져 있는 상태로 남게 되었다.

2.1. 특수 문자

특수 문자는 유니코드 1.1과 KS X 1001(완성형)을 혼합한 형태로, 문자의 코드 포인트 위치만 다르고 배열 순서가 일치하는 형태로 구성되어 있다. 로마자, 국제 음성 기호(IPA), 그리스 문자, 키릴 문자, 주음 부호, 가나 등이 유니코드 1.1과 위치만 다르고 배열 순서가 일치하며, ‘전각 기호’라는 말이 붙은 영역들은 가나를 제외한 KS X 1001의 특수 문자를 KS X 1001과 같은 순서로 포함하고 있다. 즉 한컴 2바이트 코드 값에 영역에 따라 어떤 수를 더하거나 빼면 유니코드나 KS X 1001로 코드 페이지 변환을 쉽게 할 수 있다.

두 코드 체계를 혼합하다 보니, 유니코드와 KS X 1001에 모두 들어가는 일부 문자들은 두 코드에 배당되어 있다. 예를 들어 ※(U+203B, KS X 1001에서 0xA1D8)의 경우 유니코드 1.1을 고려한 0x203B와 KS X 1001을 고려한 0x3438에 중복 배당되어 있다.

0x3800부터 0x3BFF까지는 반각 사용자 영역, 0x3C00부터 0x3FFF까지는 전각 사용자 영역으로 정의되어 있다.

하지만 ‘기타 기호’(0x2500 ~ 0x2FFF)에 있는 일부 기호와 ‘사전용 약물’(0x2B00 ~ 0x2DFF)의 대부분, ‘키 캡’(0x3300 ~ 0x33FF) 전체는 유니코드에도 대응하는 문자가 없어, 한/글 2004 이후부터는 그 기호들이 모두 유니코드의 ‘사용자 영역 보충-A’ 영역(U+F0000 ~ U+FFFFF, 한/글 문자표에서는 ‘한글 호환 영역’)에 대응되어 있다. (한/글 워디안과 2002에서는 유니코드 서러게이트(surrogate, U+10000 이상의 문자)를 지원하지 않아 이(Yi) 문자 영역(U+A000 ~ U+A4CF)에 임시로 들어가 있었다.)

한컴 2바이트에 배당된 특수 문자와 한자의 한컴 2바이트 코드 값은 한/글 워디안 이상에서도 ‘한글(HNC) 문자표’에 남아 있다.

2.2. 한글

한글은 0x8000부터 0xFFFF에 배당돼 있으며, 한글 상용 조합형 인코딩을 개조한 형태[2]이다. 상용 조합형과 다른 부분은 굵게 처리했다.
코드초성중성종성
0-
1(채움)-(채움)
2(채움)
3
4
5
6
7
8-
9-
10
11
12
13
14
15
16-
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

중성의 빈 부분에는 낱자 나열과 조합형으로 표현되지 않는 완성형 옛한글(1900여자)이 주로 들어가 있다.

0x8000 ~ 0x801F, 0x8400 ~ 0x841F, 0x8800 ~ 0x881F, 0x8C00 ~ 0x8C1F, 0x9000 ~ 0x901F, 0x9400 ~ 0x941F, 0x9800 ~ 0x981F, 0x9C00 ~ 0x9C1F, 0xA000 ~ 0xA01F, 0xA400 ~ 0xA413에 낱자 나열이 있는데, 이 낱자 나열의 특이한 점은 초성과 종성의 개수가 같다는 것이며(초성에 ㄽ이 있고 종성에 ㅃ이 있는 것 등), 배열 순서가 현대 한글 낱자 → 한/글 1.5에 있던 조합형 옛한글 낱자 → 한/글 2.0에서 추가된 완성형 옛한글 자모 순이라는 것이다.

그래서 일부 낱자는 두 코드에 배당되어 있다. 예를 들어 종성 ㄱ은 0x8442와 0x940E에 배당돼 있는데, 0x8442의 ㄱ은 조합형 한글 규칙에 따라 자연스럽게 만들어진 낱자이고 0x940E는 낱자를 쭉 나열하면서 들어간 것이다. 0x8442의 ㄱ과 0x940E의 ㄱ은 사실상 서로 같으나, 당시 한/글에서 그 둘의 글꼴 모양은 달랐다. 0x8442의 ㄱ은 아래에 치우쳐져 그려졌고(‘낙’에서 ‘나’를 지운 모양) 0x940E의 ㄱ은 호환용 자모와 같이 전체 공간을 차지했다.

2.2.1. 완성형 옛한글의 버그

완성형 옛한글 중 0xCC15에 ㅄ+ㆍ+ㅈㅇ이라는 글자가 들어가 있다. 하지만 종성 ㅈㅇ은 한컴 2바이트 코드에서는 초성과 호환을 맞추기 위해서만 존재하는데다 한양 PUA와 유니코드에는 아예 존재하지 않는 것으로 보아 잘못 들어간 글자로 보인다. 그래서 이 글자를 저장한 한/글 97 파일을 한/글 워디안 이상에서 열면 이 글자가 ‘ ’(U+3000)으로 바뀌어 버린다.

또 0xD817에 ㅇ+ㅗ+ㄹㄱㄱ이라는 글자가 들어가 있는데, 이 글자는 한컴 2바이트 코드에 ㄹㄱㄱ이 없는데도 배당되어 있으며, 한/글 97에서는 ㅇ+ㅗ+ᇖ으로 입력해야 한다. 이 글자가 오ᇐ(0xD816) 뒤에 있는 것으로 보아 순서 상으로 따졌을 때 원래 의도한 글자는 오ᇖ 같으나, 이 글자를 저장한 한/글 97 파일을 한/글 워디안 이상에서 열었을 때 한양 PUA의 오ᇖ(U+EE01)이 아니라 ㅇ+ㅗ+ㄹㄱㄱ(U+EDFD)으로 변환되는 것으로 보아 자세한 사항은 알 수 없다.

2.3. 한자

‘한자(제1수준)’(0x4000 ~ 0x5317)은 KS X 1001의 한자 4888자이고, ‘한자(제2수준)’(0x5318 ~ 0x7FFF)의 10000여 자는 한/글에서 고문헌 입력 위주로 자체 배당한 한자이다. 약자나 속자는 따로 배당되어 있지 않으며, 신자체·간체자를 표현하려면 ‘신명조 약자’, ‘신명조 간자’와 같은 글꼴을 써야 했다. (예를 들어, 經에 신명조 약자를 적용하면 신자체 経이 표현되고 신명조 간자를 적용하면 간체자 经이 표현되는 식이었다.) 이는 정자와 약자·속자가 따로 배당되어 있는 유니코드와는 다르다.

2.3.1. 2수준 한자 ↔ 유니코드 변환 시 주의할 점

한/글 워디안과 2002는 서러게이트 문자를 지원하지 않아, 유니코드의 기본 다국어 평면(BMP, U+0000 ~ U+FFFF)에 존재하지 않던 일부 한컴 2바이트 코드 한자들이 U+A7xx 영역에 임시로 대응·배당돼 있었다. 한/글 2004부터는 서러게이트 문자를 지원하기 시작했지만, 문자표만 2007에 가서야 제대로 개선되었고, 한/글 97 문서를 불러 올 때 쓰이는 변환 테이블은 아직까지도 고쳐지지 않았다(즉, U+A7xx 영역을 계속 쓰도록 돼 있다.). 한/글 2007부터는 유니코드 서러게이트 영역에조차 아직 등록되지 않은 한컴 2바이트 코드 고유 한자들이 U+F0700부터 U+F070C에 임시로 배당되어 있다.

예를 들어 0x531C는 한/글 2005까지는 임시로 U+A700에 대응돼 있었다가, 2007에 가서야 문자표에서는 U+20850(𠡐)으로 올바르게 대응되었지만, 0x531C를 저장한 한/글 97 파일을 한/글 2007에서 열어 보면 U+A700으로 잘못 변환된다.

하지만 0x64A1은 유니코드에 U+517A(兺)로 존재하는데도 한/글 2005까지는 U+A762로, 한/글 2007 문자표에서는 U+F0704로 잘못 대응돼 있다. 또 0x7EBC는 유니코드의 U+470C(䜌)로 잘못 대응되어 있으며, U+9FBB(龻)로 대응하는 것이 옳다. (U+470C는 전체를 차지하지만, U+9FBB는 윗부분만 차지하며, 한/글 97에서 0x7EBC는 U+9FBB의 형태를 하고 있다.) 이는 U+9FBB가 유니코드 4.1에서 추가되었기 때문으로, 한/글은 2004 이후로는 유니코드 3.1까지만 지원하기에 아직도 올바른 한자로 대응할 수 없는 것이다.

이 외에도 잘못 대응되어 있는 한자가 있을 수 있다.
----
  • [1] 한/글 97 도움말의 ‘문자표 선택’ 항목
  • [2] 한/글 97 도움말의 ‘조합형 한글을 쓸 수 있는 한/글’ 항목 중 “… 조합형 한글을 최초로 채택한 윈도우즈용 워드프로세서가 되었고, …” 및 “한/글에서는 윈도우즈 환경에서 조합형 한글을 완벽하게 지원함으로써 우리 글의 자유로운 표현과 온전한 데이터 정렬을 가능하게 하고 있습니다.”