[Develope]

내용정리및 ISO-2022-KR의 이해

하늘을닮은호수M 2006. 10. 23. 12:05
반응형

지금까지는 ISO 2022에서 규정하고 있는 문자셋 중에서 아스키 문자셋을 위주로 설명하였다. 그러나 2바이트 문자체계를 갖는 한국, 중국, 일본문자는 그 설명이 미비하였다. 따라서 이 장에서는 지금까지 설명한 내용을 정리하는 한편 이러한 이론적 지식을 바탕으로 2바이트 문자체계중 특히 한글의 인코딩 방식에 대해 중점적으로 설명하겠다.

사실 코드에 관한 지금까지의 설명을 완전히 이해하였다면 KSC5601 문자체계를 ISO 2022식으로 인코딩하는 방식에 대해 어렴풋이 감을 잡을 수 있을 것이다.

<제목차례>

  • 1. 내용정리 1
    • 1.1 코드화의 필요성 1
    • 1.2 주어진 비트배열의 영역구분(코드 테이블) 2
    • 1.3 코드 확장 3
    • 1.4 지정(designation)하는 방법 5
    • 1.5 호출(invocation)하는 방법 7
  • 2. 2바이트 문자와 KSC 5601-1987 7
    • 2.1 중첩된 문자셋 7
    • 2.2 KSC-5601-1987 8
  • 3. ISO 2022-KR 10

1. 내용정리

1.1 코드화의 필요성

문자(글자)를 각 비트조합에 배정하는 것을 코드화 한다고 하며 간단히 코드라고 한다. 다시말해서 A -> 10100과 같이 문자를 컴퓨터가 이해할 수 있는 이진수와 대응시키는 것을 코드라고 한다. 그러나 A와 같은 인간의 문자는 각 언어마다 표준화 되어 있으나 이에 대응되는 컴퓨터 코드는 표준화된 것이 없었다.

문자를 코드화 하는 가장 좋은 방법은 각 언어 하나하나마다 코드를 배정하는 것이다. 한글, 한자, 일어, 영어 각언어 한문자마다 한개의 코드를 배정하는 것이다. 하지만 이렇게 한다면 컴퓨터의 대부분의 기능을 코드에 사용할 정도로 많은 컴퓨터 자원을 소모할 것이다.

그렇다면 처리속도도 빠르고 많은 문자를 코드화할 수 있는 방법은 없는 것일까? 이것은 서로 상충된 질문이다. 처리속도가 빠르려면 컴퓨터가 한번에 처리할 수 있는 묶음단위인 바이트 크기(비트의 수)를 최소화 해야하고 많은 문자를 표현하려면 바이트 크기(비트의 수)를 늘려야 하므로 둘사이에 어떤 균형점을 찾아야 한다.

[그림 1] 코드화의 3단계

이 균형점은 주어진 바이트로 문자를 코드화 한후 이 코드를 다시 확장하여 사용하는 방법이다. 따라서 코드화에 관한 내용은 주어진 바이트를 가지고 문자를 코드화하는 방법과 이를 확장하는 방법, 각각의 확장된 부분을 선택하는 방법의 세가지로 나눌수 있다.

1.2 주어진 비트배열의 영역구분(코드 테이블)

7비트의 경우 가능한 비트조합은 2^7=128가지가 있다. 각 부분은 제어문자 영역과 실제 문자가 찍히는 그래픽문자 영역으로 나뉜다. 8비트의 경우 7비트가 두개 있는 것과 같다. 따라서 두개의 제어문자, 두개의 그래픽문자 영역으로 나눌 수 있다.

또한 천공카드의 영향으로 NULL, DELETE위치가 고정되고 SORT(정열) 목적으로 스페이스 문자가 그래픽문자의 처음에 배정되었다.

[그림 2] 2개의 7비트로 나누어진 8비트 코드

이렇게 각 영역을 구분해 놓은 표를 가르켜 "코드 테이블"이라고 하며 각부분은 CL(control left), CR(control Right), GL(graphic left), GR(graphic right)으로 구분한다. 그리고 코드 테이블의 어떤 위치를 참조할 때는 colum/row와 같이 지칭한다. 예를 들어 02/00은 02열 00행의 위치를 지칭한다.

[그림 3] 8비트 코드테이블

GL영역은 "02/01-07/14"의 94개 위치나 "02/00-07/15"의 96개 위치가 배정될 수 있고
GR영역은 "10/01-15/14"의 94개 위치나 "10/00-15/15"의 96개 위치가 배정될 수 있다.

1.3 코드 확장

만일 7비트만의 코드테이블을 구성한다면 CL,GR로 이루어진 영역이 이에 해당할 것이다. 그리고 GL영역을 Locking shift를 한다면 또 하나의 94/96개 위치를 갖는 공간이 생길 것이다. 이때 CL이 Locking shift되지 않는 이유는 제어문자는 라킹 쉬프트된 상태나 쉬프트 되지 않은 상태에서 공통으로 사용할 수 있기 때문이다.

그리고 쉬프트된 영역은 원래의 GL에서와 같은 비트이며 단지 Locking shift되었다는 것만 다르다. 이것은 타자기에서 쉬프트를 누른 상태에서 a를 치면 대문자 A가 나오는 것과 같다. a와 A는 그 위치가 같으나 단지 쉬프트를 누른상태인지 아닌지에서만 차이가 나는 것이다.

이제 Locking shift 메카니즘을 8비트에까지 확장하면 GR위치까지 쉬프프 할 수 있으므로 94/96 위치를 갖는 가상영역이 4개 생성된다. 이렇게 생성된 각 영역을 G0, G1, G2, G3라고 부른다.

[그림 4] G0, G1, G2, G3

G0, G1, G2, G3영역은 코드테이블의 GL, GR과는 사뭇 다르다. G0, G1, G2, G3는 실제 문자가 배정될 94/96개의 위치에 관한 각부분을 말하고 GL/GR는 직접 코드화되는 비트조합으로 그래픽문자에 관한 부분을 말한다. 따라서 Gn은 단지 94/96개의 위치만을 갖는 4개부분을 의미하고 GL/GR은 각위치가 비트조합과 대응된 것을 의미한다.

타자기를 예를 들어 설명해보자.

[그림 5] 타자기 비유

위에서 A는 타자기의 본체에 해당하는 부분으로 7비트의 경우 GL이라는 1개짜리 헤드를 갖고 8비트의 경우 GL/GR이라는 두개의 헤드를 갖는다. 따라서 A를 컴퓨터에서는 코드테이블이라고 할 수 있다. 그리고 B는 헤드에 끼울 수 있는 망치로서 어떤 헤드든지 4개 종류의 망치를 끼울수 있다. 이 망치끝에는 아직도 활자가 새겨져 있지 않다. 이 B을 컴퓨터에서는 코드요소(code element)라고 한다. 그리고 이 망치끝에는 활자가 새겨져 있는데 영어, 한글등의 글자를 망치끝에 새길 수 있다.

그러므로 문자 하나를 찍어내기 위해서는 C에서 언어를 선택한 다음 B에서 망치 끝에 활자를 새겨넣고 A의 자판과 연결된 헤드에 이를 끼우는 것이다. 이것을 컴퓨터 용어로 재해석하면 C에서 언어를 선택하는 단계를 ISO-IR xx중 하나의 문자셋을 선택한다고 하고 이를 B의 망치끝에 새기는 것을 지정(Designation)이라 하며 마지막으로 본체와 연결하는 단계 A를 호출(Invocation)이라고 한다.

1.4 지정(designation)하는 방법

ISO 2375 Register에 escape sequence에 의해 그래픽문자를 지정하는 방법이 있다. 그러면 그래픽문자셋은 각국의 문자셋 표준을 ISO-IR xx식으로 이름을 붙여놓았다는 것은 알겠는데 escape sequence는 무엇이며 어디에 사용하는가?

먼저 Cn코드에 대해 이야기 해보자. Cn코드에는 각종 제어문자가 비트조합에 연결된다. 여기에 있는 문자는 한바이트로 코드화 할 수 있지만 그 쓰임새가 다른 하나가 있다. 이것은 Escape문자로서 01/11로 그 위치가 고정되어 있다. ESC문자는 ESC문자 다음에 추가적인 비트가 뒤따른다는 표시로서 변수를 포함한 정보를 코드화 하는데 사용한다.

그리고 7비트의 C0에서는 C0요소는 CL에 호출된다. 그러나 C1은 CL에 호출되지 못하고 escape sequence를 사용하여 C1요소를 나타낼 수 있다. 8비트의 경우에는 CR영역이 있으므로 C1요소는 CR에 호출하면 된다. 또한 8비트에서도 C1요소를 CR에 호출하지 않고 escape sequence를 사용할 수 있다. 그러나 이를 혼용해서는 안된다. 따라서 8비트에서는 C1영역을 어떻게 코드화하였는지를 명시하는 공표(Announcement)가 필요하다.

이 escape sequence를 이용하여 사용하려는 문자셋이 G0, G1, G2, G3중 어디에 대입될 것인지 지정할 수 있다. 여기에는 ISO 2022에서 몇가지 규칙을 정해놓았다.

G0는 공백과 지움문자가 포함되어야 하므로 반드시 94개 위치를 갖는다. 그러나 G1, G2, G3는 94개 도는 96개의 위치를 가질 수 있다. 그리고 2바이트 문자를 지정하는 방법까지 있으므로 다음과 같이 11개의 조합이 생긴다.

94 문자셋 -> esc ( ID
94 문자셋 -> esc ) ID
94 문자셋 -> esc * ID
94 문자셋 -> esc + ID
94x94..(2바이트 이상)문자셋 -> esc $ ( ID
94x94..(2바이트 이상)문자셋 -> esc $ ) ID
94x94..(2바이트 이상)문자셋 -> esc $ * ID
94x94..(2바이트 이상)문자셋 -> esc $ + ID
94 문자셋 -> esc - ID
96 문자셋 -> esc . ID
96 문자셋 -> esc / ID

이때 94문자셋으로 사용될 수 있는 언어로
B US-ASCII
I katakana
J JIS-Roman

그리고 다중바이트(N바이트라고도 부름)94로는
@ JIS C 6226-1987
A GB 2312-1980
B JIS X0208-1990
C KSC 5601-1987
D JIS X0212-1990
E GB 2312-1980 + GB 8565-1980
G CNS 11643-1986 level 1
H CNS 11643-1986 level 2
I CNS 11643-1986 level 3
J CNS 11643-1986 level 4
K CNS 11643-1986 level 5
L CNS 11643-1986 level 6
M CNS 11643-1986 level 7

그리고 96문자셋으로는
A right half of ISO 8859-1:1987(ISO Latin-1)
B right half of ISO 8859-2:1987(ISO Latin-2)
C right half of ISO 8859-3:1987(ISO Latin-3)
D right half of ISO 8859-4:1987(ISO Latin-4)
F right half of ISO 8859-7:1987(ISO Latin-Greek)
G right half of ISO 8859-6:1987(ISO Latin-Arabic)
H right half of ISO 8859-8:1987(ISO Latin-Hebrew)
L right half of ISO 8859-5:1987(ISO Latin-Cyrillic)
M right half of ISO 8859-9:1987(ISO Latin-5)
T Thai character set TIS 620-2533:1990
V right half of ISO 8859-1:1992(ISO Latin-6)
가 있다.

예를 들어 KSC-5601 문자셋을 지정한다고 해보자. 이것은 ISO2022에서 escape sequence로 ESC 02/04 02/09 04/03로 정해놓았다. ESC는 다음에 변수가 나온다는 시작표시이고 02/04는 지정된 문자셋은 2바이트 문자로 되어 있다는 것을 나타내주고 02/09는 이 문자셋이 G1에 지정(designation)된다는 것을 명시하며 04/03은 escape sequence를 이용하여 C1영역을 표시한다는 것을 나타낸다.

여기서 호출이 명시되지 않은 이유는 7비트의 경우 GR영역이 없으므로 G0, G1영역밖에 없기때문이다. G0에는 아스키를 배정하고 G1에는 한글(KSC 5601)의 문자셋을 배정한 것이다. 따라서 당연히 GL영역에 호출되기 때문이다.

1.5 호출(invocation)하는 방법

호출의 주요수단은 Locking shift와 Single shift이다. 호출이란 코드요소 G1-3을 GL/R에 불러들이는 것이므로 가능한 조합은 2x4로 8가지가 된다. 그러나 G0코드요소는 반드시 SP와 DEL이 있어야 하므로 GL에만 호출될 수 밖에 없다. 따라서 가능한 조합은 모두 7가지가 된다.

GL만 있는 7비트의 경우 SO/SI라는 C0 코드요소인 S0와 SI을 이용하여 G0와 G1을 바꿀수 있다. 그러나 G2나 G3를 GL에 호출하여면 C1의 코드요소를 이용하여야 하므로 escape sequence를 사용할 수 밖에 없다. 7비트와 8비트로 나누어 호출하는 방법을 살펴보자.

[7비트]
G0 ->GL 00/15 Locking shift를 이용
G1 ->GL 00/14 Locking shift를 이용
G2 ->GL ESC 06/14와 single shift esc N
G3 ->GL ESC 06/15와 single shift esc O

[8비트]
G1 ->GR ESC 07/14
G2 ->GR ESC 07/13와 single shfit 8E
G3 ->GR ESC 07/12와 single shfit 8F

2. 2바이트 문자와 KSC 5601-1987

세계 각국의 언어는 ISO-IR xx에 문자셋이 등록되어 있는데 xx는 숫자를 의미한다. 예를 들어 ASCII는 ISO-IR 6라는 이름으로 등록되어 있다. 한글은 KSC-5601-1987이 ISO-IR 149이란 문자셋으로 등록되어 있는데 KSC 5601은 ISO 2022와는 좀 성격이 다르다. KSC 5601은 94x94의 각위치(행열)에 한글 문자를 일정한 순서에 따라 배열해 놓은 문자셋을 의미하며 실제 컴퓨터가 메모리나 디스크상에서 사용되는 것과는 다른 추상적인 개념이다.

2.1 중첩된 문자셋

ISO/IEC 2022에서는 94/96개의 코드위치에 대해 다음과 같은 방식으로 문자를 배정하도록 하고 있다.

  1. 각 코드위치는(code position) 하나의 문자가 배정되거나 아니면 배정되지 않는 상태로 둔다.
  2. 각 코드위치는(code position) 추가로 94/96개의 코드위치셋을 가질 수 있다. 이렇게 중첩해서 문자셋을 가질때 94위치셋은 94개, 96 위치셋은 96개를 가지며 서로 교차하여 가질 수 없다고 규정하고 있다.

그리고 중첩된 문자셋을 코딩할때는 다음 알고리즘에 따라 처리하도록 하고 있다.

  1. "중첩된 문자를 위해 추가된 바이트"를 취해 그 바이트가 문자인지, 문자셋인지 구별한다. 이와 같은 구별은 현재 호출되어 있는 문자셋의 해당바이트를 보고 문자인지 문자셋인지 알수 있다.(control function 참조)
  2. 만일 추가된 바이트가 문자셋을 가르키는 것이라면 해당 문자셋은 현재문자셋이 호출되어 있는 영역에(GL영역이면 GL, GR영역이면 GR) 호출되어 기존의 문자셋을 대체한다. 그리고 다시 해당바이트가 문자인지 문자셋인지 구별하는 단계 1로 간다.
  3. 만일 1)에서 구별된 바이트가 문자이면 "중첩된 바이트로 나타내는 문자"로 인식하고 알고리즘을 종료한다.

2.2 KSC-5601-1987

이 규정을 만족하면서 2바이트로 구성된 한글 문자셋을 만들어 보자. 아스키 문자가 배정되는 G0는 GL에 호출되도록 하고 있으므로 한글은 GR영역에 호출되어야 한다. 그리고 GR에 호출될 수 있는 코드요소는 94/96개를 갖는데 G0가 Space와 Delete문자 때문에 반드시 94개 위치를 가지므로 이 94개를 쉬프트 라킹해도 역시 94개를 가져야 한다. 따라서 2바이트로 한글을 표현하므로 94X94코드요소를 갖게된다.

GR영역에 한글이 호출된다는 것은 KSC5601이 8비트환경임을 알수 있다. 이를 그림으로 설명해보자.

[그림 6] 94x94 문자셋

예를 들어 A1위치는 A1, A2,...FE까지 다른 코드요소의 원소를 가질 수 있다. 그러므로 94개의 각 위치는 다시 94개 문자셋을 가질수 있으므로 최대 94x94=8836문자를 지정할 수 있다. 그러면 여기에 들어갈 문자는 어떻게 지정할 것인가? 지정할 문자가 한정되어 있으므로 아무래도 많이 사용하는 문자를 넣어야 할 것이다. 이 과정에서 자주 쓰이지 않는 고어나 방언들이 제외된 것이다. 그리고 한글을 정열할 때 가나다 순이 되어야 하므로 가나다 순으로 많이 쓰이는 글자를 배열한 것이다.

이렇게 94x94셋을 가질 때 왼쪽의 원소를 rows라고 한다. 이 로우는 코드테이블에서의 로우와 다른 의미다. 예를 들어 왼쪽 A1x오른쪽 94배열의 쌍을 1행, A2x94를 2행..과 같이 표현한 것이다.

Row 1: 94개 symbols
Row 2: 69개 abbreviations and symbols
Row 3: 94 full-width KS C 5636-1993 characters
Row 4: 94 hangul elements
Row 5: 68 lowercase and uppercase Roman numerals and lowercase and upper Greek alphabet
Row 6: 68 괘선문자
Row 7: 79 abbreviation
Row 8: 91 phonetic symbols, circled characters, and fractions
Row 9: 94 phonetic symbols, parenthesized characters, subscripts, and superscripts
Row 10: 83 hiragana
Row 11: 86 katakana
Row 12: 66 lowercase and uppercase cyrillic(Russian) alphabet
Row 16-40: 2,350 완성형
Row 42-93: 4,888 한자

94x94 위치는 각각 GR에 호출된다. 따라서 이 94x94코드를 GRGR조합이라고 표현하기도 한다.

3. ISO 2022-KR

사실 KSC 5601 C 1987은 ISO 2022의 국제 조류에 부응하기위해 만든 문자셋이다. 따라서 이 문자셋을 ISO 2022로 코드화하는데 별 어려움이 없다. 그러나 여기서 주의할 점이 있다. ISO 2022라하면 7비트, 8비트의 인코딩 모두를 가르키나 ISO-2022-KR이라고 하면 메일환경에서 사용할 7비트 인코딩 방식을 이야기한다. ISO-2022-KR은 그 사용용도가 메일환경에서만 사용되도록 한정되어 있다. 메일은 7비트 또는 8비트의 어떤 네트워크 환경에서든지 전송될 수 있도록 7비트로 기준을 정하였다. 그럼 KSC 5601 C 1987문자셋이 7비트 환경에서 사용되려면 GR영역을 포기하고 GL영역만 사용하여야 한다. 즉 최상위 1을 포기해야 한다.

GL영역은 locking shift에 의해 G0, G1 두 개의 코드요소만을 가지므로 G0에는 아스키(1바이트 문자)를 지정하고 G1에는 2바이트 한글(KSC 5601문자)을 지정하여 영어와 한글을 동시에 표현할 수 있다.

8비트 코드를 7비트로 바꾸려면 8비트의 CR, GR을 7비트의 해당영역으로 바꾸어 주면 된다. 8비트 영역을 7비트로 다시 표시해야할 부분은 다음과 같다.

  1. 8-9열의 C1은 7비트에서 Escape Sequence를 사용하여 표현한다.
  2. GR shift된 G1,G2,G3는 7비트에서 최상위 비트를 제거한 1-7까지만의(0비트 제외) 비트를 사용하여 표시한다. 또한 다중바이트로 표시된 문자는 각 비트마다 최상위 비트(0)를 제거하여 7비트로 표시한다.

    [그림 7] 8비트를 7비트로

  3. SS2, SS3에 의해 GR에 호출된 single character은 7비트에서 2-7열의 문자로 나타낸다.

이같은 내용을 종합해보면 한글은 8비트의 2바이트로 구성되어 있으며 7비트로 인코딩될 때 G1에 지정되고 C1코드요소는 Escape Sequence에 의해 나타낸다. 이 내용을 Escape sequence로 표현하면 ESC 02/04 02/09 04/03(ESC $ ) C)가 된다. 여기서 02/04는 multiple byte로 구성되었다는 것을, 02/09는 G1에 94 코드요소가 지정된다는 것을, C는 C1코드요소는 Escape Sequence에 의해 나타낸다는 것을 의미한다.

(ISO 2022 13.2을 참조하세요)

따라서 영문과 한글을 혼합해 사용하려면 첫째, 영어와 한글문자를 지정할 표시가 필요하고 둘째, 이렇게 지정된 문자중에서 어떤 문자를 GL에 호출할지를 결정해야 한다.

        GL ---- G0 ----- ASCII -- Default               G1 ----- Hangul -- ESC 02/04 02/09 04/03

이러한 결정은 ESC 02/04 02/09 04/03으로 한글을 사용하겠다는 것을 지정한 후 각 문자를 사용할때마다 , 문자로 GL에 호출하여 이용하면 된다. 이때 SI는 ASCII가 GL에, SO는 KSC 5601이 GL에 호출할 때 사용하는 문자이다.

그 다음절차는 메일의 본문에 어떤 방식으로 이를 적용하느냐에 관한 것이다. 이에 관한 것으로 다음과 같은 규정이 있다.

  1. Designator문자(ESC 02/04 02/09 04/03)은 한글문자가 나오기전 최초에 한번만 쓰인다. 그리고 Designator문자 다음에는 CRLF가 오지 않는다. 이것은 앞으로 사용하게될 문자가 한글임을 Designator문자를 통해 나타내며 Designator는 문자가 아닌 Escape sequence이므로 CRLF가 오지 않는다.
  2. 한글은 , ASCII는 로 바꾼다. 그리고 최초에 사용되는 문자는 ASCII이다. 한글은 2바이트 94x94문자이므로 SPACE와 DELETE문자는 인코딩의 범주에 속하지 않는다. 따라서 최초에 사용하는 문자가 아스키이므로 본문전테가 한글일 경우 지정문자 ESC 02/04 02/09 04/03으로 지정하고 로 호출하여 사용해야 한다. 그리고 SPACE, DELETE문자는 94코드요소의 밖이므로 에서 다시 하지 않고 사용할 수 있다. 결국 SPACE, DELETE문자는 영문도 한글도 아니다.
  3. 한줄의 끝이 한글로 끝나는 경우 CRLF가 나오기 전에 가 나와야 한다. 디폴트가 ASCII문자이므로 문자를 넣어주어야 한다.

예를 들어 "나는 Chonbuk National University 학생입니다"를 인코딩한다고 하자.

            ESC 02/04 02/09 04/03 나는            ChonbukNationalUniversity            학생입니다

이와 같이 ISO-2022가 7비트 인코딩 방식을 한글에 적용하여 메일에 사용할수 있는 방법을 적은 글이 Rfc 1557이다. 따라서 ISO-2022-KR과 rfc 1557은 같은 내용이다.

반응형

'[Develope]' 카테고리의 다른 글

굿  (0) 2007.01.27
Visual C/C++ 에서 compile시 symbol을 작성하도록 하는 방법.  (0) 2006.11.24
msxml wrapper class by CodeGuru  (0) 2006.08.10
[Doc]C++ MSXML Programming  (0) 2006.08.10
MS XML Overview  (0) 2006.08.09