원문보기    닫기

메뉴 보기, 닫기

정보기술 - 국제문자부호계(UCS) - 한글 - 제1부 : 정보교환용 한글 처리지침

Information Technology - Universal Multiple-Octect Coded Character Set(UCS) - Hangul - Part1 : Hangul processing guide for information interchange

    KS X 1026-1:2007

  • 조항
    1. 적용범위
    이 규격은 ISO/IEC 10646의 국제문자부호계(Universal Multiple-Octet Coded Character Set:이하 UCS로 표기)를 이용하여 정보 처리 및 데이터를 전송하는 시스템 사이에서 정보 교환에 사용되는 한글의 표현 형식 및 처리방법에 대하여 규정한다.
  • 조항
    2. 인용규격
    다음의 인용규격은 이 규격의 적용을 위해 필수적이다. 발행연도가 표기된 인용규격은 인용된 판만을 적용한다. 발행연도가 표기되지 않은 인용규격은 최신판(모든 추록을 포함)을 적용한다.
    KS X 1001:2004, 정보 교환용 부호계(한글 및 한자)
    KS X ISO/IEC 10646:2005, 정보기술-국제 문자 부호계(UCS)-구조 및 다국어 기본 평면, 보충 평면
    ISO/IEC 10646:2003, Information technology-Universal Multiple-Octet Coded Character Set(UCS)-Architecture and Basic Multilingual Plane, Supplementary Planes
    ISO/IEC 10646:2003-Amandement 5, Information technology-Universal Multiple-Octet Coded Character Set (UCS)-Architecture and Basic Multilingual Plane, Supplementary Planes
    The Unicode Standard 5.0-The Unicode Standard 5.0
    Unicode Standard Annex 15 (UAX #15)-Unicode Normalization
    Unicode Standard Annex 29 (UAX #29)-Text Boundaries
    한글 맞춤법-문교부 고시 제88-1호(1988년 1월 19일)
  • 조항
    3. 용어와 정의
    이 규격에서 사용되는 주된 용어와 정의는 다음과 같다.
  • 조항
    3.1 정보교환 (Information Interchange)
    서로 다른 시스템 사이에서도 정보를 이용할 수 있도록 하나의 시스템에서 다른 시스템으로 정보를 전달하는 것.
  • 조항
    3.2 문자 (Character)
    정보의 표현이나 제어 등에 쓰이는 유한집합의 요소로서, 도형문자와 제어문자로 분류됨.
  • 조항
    3.3 한글 낱자 (Hangul Jamo)
    한글 글자마디를 이루는 닿소리(자음), 홀소리(모음) 글자 또는 첫소리(초성), 가운뎃소리(중성), 끝소리(종성) 글자("ᄓ"이나 "ㅘ" 같은 겹글자도 하나의 낱자로 여긴다.)를 가리킴. 이 규격에서는 한글 낱자와 한글 자모는 같은 의미로 사용된다.
  • 조항
    3.4 한글 글자마디 (Hangul Syllable)
    첫소리와 가운뎃소리 글자, 또는 첫소리, 가운뎃소리, 끝소리 글자로 이루어진 한글의 단위. 한글 음절이라고도 지칭함.
  • 조항
    3.5 현대한글 (Modern Hangul)
    한글 맞춤법에서 정한 한글 낱자나 한글 글자마디를 지칭. UCS에 포함된 전체 현대한글의 글자마디는 11 172자임.
  • 조항
    3.6 옛한글(Old Hangul)
    훈민정음 창제 이후부터 근대(주로 19세기 말 또는 20세기 초)까지 사용되어 왔던 한글 중에서 한글 맞춤법에서 사용하지 않는 한글 낱자나 한글 글자마디를 지칭
  • 조항
    3.7 정규화(Normalization)
    UCS에서, 어떤 문자에 대해서는 여러 가지 이진 표현(binary representation)이 가능하기 때문에 검색, 정렬, 비교 및 기타 연산이 복잡해짐. 따라서 UCS에서는 문자의 동일한 이진 표현 중 어느 것을 전달해도 단일의 이진 표현을 반환하는 정규화라는 절차를 정의하였음.
  • 조항
    4. 한글 문자의 종류
    UCS에는 여러 종류의 한글 낱자와 글자마디, 한글을 포함한 기호(4.8 참조)가 있다. 이 장에서는 이들 문자의 종류에 대해서 정의한다. 여기서 정의된 문자는 부속서 A와 같다.
  • 조항
    4.1 조합 한글 낱자
    UCS의 한글 자모 영역인 U+1100∼U+11FF, 한글 확장 자모 A(Hangul Jamo Exteded A) 영역인 U+A960∼U+A97F, 한글 자모 확장 B(Hangul Jamo Extended-B) 영역인 U+D7B0∼U+D7FF에 지정되어 있는 한글 낱자. 옛한글 글자마디를 작성할 때 사용한다. 이 영역의 한글 낱자는 단독글자로 사용하지 않는다(부호자리 하나로 낱 글자를 표현하지 않는다).
  • 조항
    4.2 호환 한글 낱자
    UCS의 한글 호환 자모(Hangul Compatibility Jamo) 영역인 U+3130∼U+318F에 지정되어 있는 한글 낱자. 전각 모양의 한글의 닿소리와 홀소리를 각각 따로 표현할 때 사용한다. 이 영역의 한글 낱자는 조합하여 사용하지 않으며, 단독글자로 사용한다(부호자리 하나로 낱 글자를 표현한다). KS X 1001의 한글 낱자와의 호환을 목적으로 한다.
  • 조항
    4.3 반각 한글 낱자
    UCS의 반각 한글 낱자(Halfwidth Hangul Letter) 영역인 U+FFA0∼U+FFDF에 지정되어 있는 한글 낱자. 이 영역의 한글 낱자는 조합하여 사용하지 않는다. KS X 1001에 나타낸 부속서 4의 7비트 한글 낱자 부호계와 호환을 목적으로 한다.
  • 조항
    4.4 완성형 한글 글자마디
    완성형 한글 글자마디는 현대한글 11 172자에 대하여 글자마디를 부호값 하나로 표현하여, UCS의 한글 음절(Hangul Syllables) 영역인 U+AC00∼U+D7A3에 배치한 것들이다.
  • 조항
    4.5 조합형 한글 글자마디
    조합형 한글 글자마디는 조합 한글 낱자를 이용하여 표현한 한글 글자마디로, 첫소리와 가운뎃소리 낱자, 또는 첫소리, 가운뎃소리, 끝소리 한글 낱자로 이루어진다. 또한, 한글의 첫소리, 가운뎃소리, 끝소리 낱자 각각을 표현하거나, 가운뎃소리와 끝소리 글자만으로 이루어진 글자마디 등 모양을 못 갖춘 한글 글자마디의 표현을 위해서는 첫소리 채움 U+115F 글자와 가운뎃소리 채움 U+1160 글자를 사용한다.
  • 조항
    4.6 못 갖춘 글자마디
    이 규격에서 못 갖춘 글자마디는 다음과 같은 경우를 의미한다.
    1) 첫소리 글자뿐일 때
    보기 ㄱ, ㄴ, ㄷ
    2) 가운뎃소리 글자뿐일 때
    보기 ㅏ, ㅑ, ㅓ
    3) 끝소리 글자뿐일 때
    보기 ㄱ, ㄴ, ㄷ
    4) 가운뎃소리 글자와 끝소리 글자 뿐일 때
       보기 
    비고   첫소리 글자와 끝소리 글자만의 조합은 허용하지 않는다.
  • 조항
    4.7 방점
    방점은 한글 각 글자마디의 성조를 표시하기 위한 훈민정음의 표기법으로, 평성(平聲)은 점이 없고, 거성(去聲)은 한 점, 상성(上聲)은 두 점을 글자마디의 왼편에 찍었다. UCS에서 거성 부호는 U+302E, 상성 부호는 U+302F이다.
  • 조항
    4.8 한글 포함 기호
    UCS의 괄호 안 문자와 동그라미 안 문자(Enclosed CJK Letters and Months) 영역인 U+3200∼U+32FF에 있는 괄호 안 한글 낱자와 글자마디, 동그라미 안 한글 낱자와 글자마디를 지칭한다.
  • 조항
    5. 한글 표현 형식
  • 조항
    5.1 한글 낱자의 표현
    이 규격에서 한글 낱자는 닿소리, 홀소리 글자로 나타내거나 첫소리, 가운뎃소리, 끝소리 글자로 나타낼 수 있다.
    닿소리와 홀소리 글자를 각각 표현하기 위해서는 한글 호환 자모(Hangul Compatibility Jamo) 영역인 U+3131∼U+318E에 지정되어 있는 한글 낱자를 단독으로 부호자리 하나로 표현하여 사용한다.
    첫소리, 가운뎃소리, 끝소리 글자를 개별적으로 표현하기 위해서는 한글 자모 영역인 U+1100∼U+11FF, 한글 확장 자모 A(Hangul Jamo Exteded A) 영역인 U+A960∼U+A97F, 한글 자모 확장 B(Hangul Jamo Extended-B) 영역인 U+D7B0∼U+D7FF에 있는 조합 한글 낱자를 사용한다. 이 영역의 낱자는 채움 문자 없이 단독으로 사용하는 것을 금하며 채움 문자를 사용하여 표기해야 한다. 또한, 겹글자를 표기하기 위하여 낱자 여러 개를 사용하는 것을 금한다. 한글의 첫소리 낱자를 L, 가운뎃소리 낱자를 V, 끝소리 낱자를 T라고 하고, 첫소리 채움을 LF, 가운뎃소리 채움을 VF라 할 때, 이 규칙을 정규식(regular expression)으로 표현하면 다음과 같다.
    1) 첫소리 글자의 표현:L VF
    보기 첫소리 글자 ㄱ ⇒ ㄱ VF (U+1100 U+1160)
    2) 가운뎃소리 글자의 표현:LF V
    보기 가운뎃소리 글자 ㅏ ⇒ LF ㅏ(U+115F U+1161)
    3) 끝소리 글자의 표현:LF VF T
    보기 끝소리 글자 ㄱ ⇒ LF VF ㄱ(U+115F U+1160 U+11A8)
  • 조항
    5.2 현대한글 글자마디의 표현
    현대한글 글자마디는 한글 음절(Hangul Syllables) 영역인 U+AC00∼U+D7A3의 11 172자를 사용한다. 응용 프로그램의 외부와 자료를 보내고 받을 때는 반드시 완성형 한글 글자마디로 처리해야 한다. 자료를 보내고 받는 방법에는 클립보드(clipboard) 입출력, 파일 입출력, 통신 프로토콜을 통한 입출력 등 가능한 모든 정보 교환 방법이 포함된다.
  • 조항
    5.3 옛한글 글자마디의 표현
    옛한글 글자마디는 조합형 한글 글자마디를 위한 한글 자모 영역인 U+1100∼U+11FF, 한글 확장 자모 A(Hangul Jamo Exteded A) 영역인 U+A960∼U+A97F, 한글 자모 확장 B(Hangul Jamo Extended-B) 영역인 U+D7B0∼U+D7FF에 있는 조합 한글 낱자를 사용하여 아래 3가지 규칙에 맞추어 표기해야 한다. 또한 가운뎃소리와 끝소리로 이루어진 것 같은 못 갖춘 한글 글자마디의 표현도 이 규칙을 따른다. 한글의 첫소리 낱자를 L(채움 문자 LF 포함), 가운뎃소리 낱자를 V(채움 문자 VF 포함), 끝소리 낱자를 T라고 할 때, 3가지 규칙을 정규식으로 표현하면 다음과 같다.
    1) 첫소리와 가운뎃소리로 이루어진 글자:L V
       보기 
    2) 첫소리, 가운뎃소리, 끝소리로 이루어진 글자:L V T
       보기 
    3) 가운뎃소리, 끝소리로 이루어진 글자:LF V T
       보기 
    또한 조합형 한글 글자마디의 표현에서, 다음과 같은 사항을 준수해야 한다.
    1) 한글 낱자의 표현 규칙에서와 마찬가지로 낱자 여러 개를 이용하여 겹글자를 표기하는 것은 금지된다.
    보기 ㄱㄱ(U+1100 U+1100, 틀림) ⇒ ㄲ(U+1101, 맞음)
    2) 완성형 한글 글자마디와 조합 한글 낱자를 다시 조합하여 한글 글자마디를 표기하는 것은 금지된다.
    보기 가ᇫ(U+AC00 U+11EB, 틀림) ⇒ (U+1101 U+1161 U+11EB, 맞음)
    3) 현대한글의 표현은 완성형 한글 글자마디로 표기하여야 하며, 조합형 한글 글자마디로 표기하는 것은 금지된다.
    보기 ㄱㅏ(U+1100 U+1161, 틀림) ⇒ 가(U+AC00, 맞음)
  • 조항
    5.4 방점의 표현
    방점(거성으로 U+302E를, 상성으로는 U+302F)은 단독으로 사용할 수 없고, 반드시 한 개의 한글 글자마디(현대한글 및 옛한글) 다음에 연이어 사용해야 한다. 즉, 글자마디 중간에 방점이 나타나서는 안 된다. 또한, 방점은 두 개를 동시에 사용해서는 안 되고, 한번에 한 개만 나타나야 한다. 완성형 현대한글 글자마디를 S라 하고, 방점을 M이라 하며, ‘?'는 이전의 기호가 없거나 한 개만 있다는 수량 한정자라고 할 때, 방점을 포함한 글자마디 규칙을 정규식으로 표현하면 다음과 같다.
    1) 현대한글에 방점을 적용:S M?
    2) 옛한글에 방점을 적용:L V T? M?
    그런데 이들 방점은 UCS에서 합성 기호(Combining Mark)로 사용되기 때문에, 글자마디를 처리할 때는 방점을 직접적으로 포함시키지 않고 별도로 처리한다.
  • 조항
    6. 한글의 정규화
  • 조항
    6.1 한글 코드의 정규화
    UCS 문자에는 조합 또는 합성 UCS 문자의 집합으로 구성된 여러 개의 동일한 이진 표현이 있다. 즉, 단일 문자에 대해 여러 표현이 있을 수 있기 때문에 검색, 정렬, 비교 및 기타 연산이 복잡해진다. 따라서 UAX #15에 의해 UCS 문자의 동일한 이진 표현 중 어느 것을 전달해도 단일의 이진 표현을 반환하는 정규화 절차가 C, D, KC, KD라는 네 가지의 형식으로 정의되어 있다. 이 정규화 절차는 한글에도 그대로 적용된다. 예를 들면, 완성형 한글 글자마디와 조합형 한글 글자마디를 정규화를 통해서 변환하여 응용의 내부에서 사용할 수 있다. 그러나 위의 정규화 절차에 의해 발생될 수 있는 한글 호환성이 확보되지 않는 문제를 해결하기 위해서 다음 6.2부터 6.4를 따를 것을 권고한다. 처리에 관련된 알고리즘은 부속서 B를 참조한다.
  • 조항
    6.2 호환 한글 낱자와 반각 한글 낱자의 정규화
    호환 한글 낱자와 반각 한글 낱자는 UCS에서 조합에 사용하지 않는 것으로 규정되어 있다. 하지만, 이들 한글 낱자가 정규화 형식 KD를 거치면서 채움 문자 없이 조합형 한글 낱자로 변환되면, 앞뒤의 한글 음절과 어울려 정규화 형식 KC에서 완성형 한글 글자마디로 변할 가능성이 있다. 따라서 호환 한글 낱자와 반각 한글 낱자를 KD, KC 형식으로 변환할 때 채움 문자를 사용하여 올바른 한글 글자마디 형태로 처리하기를 권고한다.
    표 1 ― 호환성이 없는 정규화 처리 예
    표 2 ― 호환성을 확보한 정규화 처리 예
  • 조항
    6.3 한글 포함 기호의 정규화
    UCS의 괄호 안 문자영역과 동그라미 안 문자(Enclosed CJK Letters and Months) 영역인 U+3200∼U+32FF에는 괄호 안 한글 낱자와 글자마디, 동그라미 안 한글 낱자와 글자마디로 불리는 기호가 다수 포함되어 있다. 이 기호에 포함된 한글 낱자는 정규화 형식 KD, KC에서 역시 채움 문자 없이 조합형 한글 낱자로 변환된다. 이들 또한 KD, KC 형식으로 변환할 때 채움 문자를 사용하여 올바른 한글 글자마디 형태로 처리하기를 권고한다.
    표 3 ― 호환성이 없는 정규화 처리 예
    표 4 ― 호환성을 확보한 정규화 처리 예
  • 조항
    6.4 한글 글자마디의 정규화
    현대한글만을 사용하는 텍스트 문자열에서는 기존의 정규화 처리를 적용하여도 한글 글자마디가 올바르게 처리된다. 그러나 옛한글을 포함할 경우에는 기존의 정규화 형식 C와 KC에서 첫소리 글자와 가운뎃소리 글자가 현대한글의 낱자이고, 끝소리 글자가 옛한글의 낱자일 경우, 첫소리 글자와 가운뎃소리 글자가 완성형 한글 글자마디로 변환되고 끝소리 글자가 따로 남는 현상이 발생한다. 따라서 이러한 경우에도 옛한글 글자마디를 첫소리, 가운뎃소리, 끝소리 글자로 형성되는 올바른 한글 글자마디 형태로 처리하여야 한다.
    표 5 ― 호환성이 없는 정규화 처리 예
    표 6 ― 호환성을 확보한 정규화 처리 예
  • 조항
    7. 한글 글자마디 분리
  • 조항
    7.1 글자마디 분리
    텍스트 문자열에 포함된 한글 글자마디를 분리하는 방법으로, 5.의 한글 표현 형식에 따라 낱자 글자마디, 현대한글 글자마디, 옛한글 글자마디를 올바로 구분하는 방법을 정의한다.
  • 조항
    7.2 현대한글 글자마디, 한글 낱자 분리 규칙
    완성형 한글 글자마디와 호환 한글 낱자, 반각 한글 낱자의 앞과 뒤는 언제나 글자마디로 분리한다. 현대한글 글자마디를 나타내는 완성형 한글 글자마디와 호환 한글 낱자, 반각 한글 낱자는 독립된 하나의 글자마디로 처리를 하고, 어떠한 경우에도 앞뒤의 다른 한글 글자마디나 한글 낱자와 조합되지 않고, 다른 글자마디와 조합하기 위해 분리되지 않는다.
  • 조항
    7.3 옛한글 글자마디 분리 규칙
    7.2의 완성형 한글 글자마디와 호환 한글 낱자, 반각 한글 낱자가 아닌 경우에는, 옛한글 낱자들을 글자마디로 분리한다. 옛한글 낱자들의 글자마디 분리 규칙은 5.3과 연관이 있다. 채움 문자를 사용하여 나타낸 글자마디는 첫소리 채움(LF)은 첫소리 낱자로, 가운뎃소리 채움(VF)은 가운뎃소리 낱자로 간주하여 다음의 규칙을 따른다. ‘×'는 글자마디 중간에서 분리불가를 의미한다.
    1) L×V :연달아 나오는 첫소리 글자와 가운뎃소리 글자는 분리하지 않는다.
    2) L V×T :연달아 나오는 첫소리, 가운뎃소리, 끝소리 글자는 분리하지 않는다.
    3) V×T :연달아 나오는 가운뎃소리 글자와 끝소리 글자는 분리하지 않는다.
    따라서 분리된 조합형 한글 글자마디는 L V T?의 형태여야 한다. 즉 L V 또는 L V T 형태이고, 어떤 경우도 두 개 이상의 글자마디로 분리하지 않는다.
  • 조항
    7.4 글자마디 분리 규칙의 정리
    한글 조합형 낱자와 기타 다른 글자들간의 글자마디 분리 규칙을 정리하면 다음의 7과 같다.
    표 7 ― 글자마디 분리 규칙(Grapheme Break Chart)

    Other
    Extend
    L
    V
    T
    S
    Other
    ÷
    ×
    ÷
    ÷
    ÷
    ÷
    Extend
    ÷
    ×
    ÷
    ÷
    ÷
    ÷
    L
    ÷
    ×
    ÷
    ×
    ÷
    ÷
    V
    ÷
    ×
    ÷
    ÷
    ×
    ÷
    T
    ÷
    ×
    ÷
    ÷
    ÷
    ÷
    S
    ÷
    ×
    ÷
    ÷
    ÷
    ÷

    S :현대한글 글자마디(U+AC00∼U+D7A3)
    ÷ :글자마디 분리
    × :글자마디 분리불가
    Extend :방점을 비롯한 합성문자 기호
    Other :S, L, V, T, Extend를 제외한 UCS 문자
    이와 같은 글자마디 분리 규칙을 적용하여 글자마디를 분리한 예는 8과 같다.
    표 8 ― 글자마디 분리 예제
    번호
    문자열

    분리된 문자열(채움문자 적용 전)
    1
    LVTLVLVLVFLFVLFVFT

    LVTㆍLVㆍLVㆍLVFㆍLFVㆍLFVFT
    2
    LLTTVVTTVVLLVV

    LㆍLㆍTㆍTㆍVㆍVTㆍTㆍVㆍVㆍLㆍLVㆍV
    3
    LLVFLFVFTTLFVVTTLFVVLLVV

    LㆍLVFㆍLFVFTㆍTㆍLFVㆍVTㆍTㆍLFVㆍVㆍLㆍLVㆍV

  • 조항
    7.5 문자열의 글자마디 경계에서 해당 글자마디 가져오기
    텍스트 문자열의 시작이나, 글자마디 경계에서 한글 글자마디 하나를 가져오는 규칙은 다음과 같다. 그러나 한글이 아닌 기타 다른 글자의 경우, 그 글자가 속하는 문자의 글자마디 분리 규칙을 따르도록 한다.
    1) 현재 글자가 현대한글 글자마디(S)이면 S를 가져온다.
    2) 현재 글자가 첫소리 낱자(L)이면, 다음 글자를 탐색한다.
      a  다음 글자가 가운뎃소리 낱자(V)이면, 그 다음 글자를 탐색한다.
    i) bsp;     i) 그 다음 글자가 끝소리 낱자(T)이면, LVT를 가져온다.
          ii) 그 다음 글자가 다른 글자이면, LV까지를 가져온다.
        b  다음 글자가 다른 글자이면, L을 가져온다.
    3) 현재 글자가 가운뎃소리 낱자(V)이면, 다음 글자를 탐색한다.
      a  다음 글자가 끝소리 낱자이면, VT를 가져온다.
      b  다음 글자가 다른 글자이면, V를 가져온다.
    4) 현재 글자가 끝소리 글자이면, T를 가져온다.
    5) 현재 글자가 다른 글자이면 해당 글자를 가져온다.
  • 조항
    7.6 한글 문자열의 순방향 글자마디 경계 탐색
    텍스트 문자열의 임의의 위치에서 순방향으로 다음 글자마디의 경계를 찾기 위한 규칙은 다음과 같다. 만일 한글 글자마디 중간에서 시작한 경우에는 다음 글자마디의 시작을 경계로 찾는다.
    1) 현재 글자가 첫소리 낱자(L)이면, 다음 글자를 탐색한다.
      a  다음 글자가 가운뎃소리 낱자(V)이면, 그 다음 글자를 탐색한다.
    i) bsp;    i) 그 다음 글자가 끝소리 낱자(T)이면, 그 다음 글자부터 경계로 한다.
         ii) 그 다음 글자가 다른 글자이면, 그 글자부터 경계로 한다.
    2) 현재 글자가 가운뎃소리 낱자(V)이면, 다음 글자를 탐색한다.
      a  다음 글자가 끝소리 낱자(T)이면, 그 다음 글자부터 경계로 한다.
      b  다음 글자가 다른 글자이면, 그 글자부터 경계로 한다.
    3) 현재 글자가 다른 글자이면 그 다음 글자부터 경계로 한다.
  • 조항
    7.7 한글 문자열의 역방향 글자마디 경계 탐색
    텍스트 문자열의 임의의 위치에서 역방향으로 이전 글자마디의 경계를 찾기 위한 규칙은 다음과 같다. 만일 한글 글자마디 중간에서 시작한 경우에는 현재 글자마디의 시작을 경계로 찾는다.
    1) 시작 위치 앞자리의 글자를 가져오고, 해당 글자를 현재 글자로 삼는다.
    2) 현재 글자가 끝소리 낱자(T)이면, 이전 글자를 탐색한다.
      a  이전 글자가 가운뎃소리 낱자(V)이면, 그 이전 글자를 탐색한다.
    i) bsp;    i) 그 이전 글자가 첫소리 낱자(L)이면, 그 글자부터 경계로 한다.
         ii) 그 이전 글자가 다른 글자이면, 이전 글자부터 경계로 한다.
    3) 현재 글자가 가운뎃소리 낱자(V)이면, 이전 글자를 탐색한다.
      a  이전 글자가 첫소리 낱자(L)이면, 그 글자부터 경계로 한다.
      b  이전 글자가 다른 글자이면, 현재 글자부터 경계로 한다.
    4) 현재 글자가 다른 글자이면 현재 글자부터 경계로 한다.
  • 조항
    7.8 한글 표현 형식을 따르지 않은 글자마디의 처리
    한글 글자마디 분리 규칙을 적용했을 때, 5.3의 글자마디 표현 형식을 제대로 따르지 않은 경우, 조합형 한글 글자마디 중 L V T? 형태가 아닌 못 갖춘 글자마디 형태가 존재하는데, 이럴 경우 채움 문자를 사용하여 다음과 같이 변환한다.
    1) L ⇒ L VF
    2) V ⇒ LF V
    3) V T ⇒ LF V T
    4) T ⇒ LF VF T
    위의 규칙을 적용하여 8의 글자마디를 변환한 결과는 9와 같다.
    표 9 ― 불완전 글자마디 처리 예제
    번호
    문자열(채움문자 적용 전)

    변환된 문자열(채움문자 적용)
    1
    LVTㆍLVㆍLVㆍLVFㆍLFVㆍLFVFT

    LVTㆍLVㆍLVㆍLVFㆍLFVㆍLFVFT
    2
    LㆍLㆍTㆍTㆍVㆍVTㆍTㆍVㆍVㆍLㆍLVㆍV

    LVFㆍLVFㆍLFVFTㆍLFVFTㆍLFVㆍLFVTㆍLFVFTㆍLFVㆍLFVㆍLVFㆍLVㆍLFV
    3
    LㆍLVFㆍLFVFTㆍTㆍLFVㆍVTㆍTㆍLFVㆍVㆍLㆍLVㆍV

    LVFㆍLVFㆍLFVFTㆍLFVFTㆍLFVㆍLFVTㆍLFVFTㆍLFVㆍLFVㆍLVFㆍLVㆍLFV

  • 조항
    8. 한글 글자의 정렬
  • 조항
    8.1 한글 낱자의 순서와 이름
    정렬을 위한 한글 낱자의 순서와 이름은 한글 맞춤법에 따르며, 옛한글을 자형 순으로 포함하여 다음과 같은 순서로 사용한다.
    1) 닿소리 낱자의 순서와 이름
    ㄱ(기역), ㄴ(니은), ㄷ(디귿), ㄹ(리을), ᄛ(가벼운리을), ㅁ(미음), ᄝ(가벼운미음), ㅂ(비읍), ᄫ(가벼운비읍), ㅅ(시옷), ᄼ(치두음시옷), ᄾ(정치음시옷), ᅀ(반시옷), ㅇ(이응), ᅌ(옛이응), ㅈ(지읒), ᅎ(치두음지읒), ᅐ(정치음지읒), ㅊ(치읓), ᅔ(치두음치읓), ᅕ(정치음치읓), ㅋ(키읔), ㅌ(티읕), ㅍ(피읖), ᅗ(가벼운피읖), ㅎ(히읗), ᅙ(여린히읗)
    2) 홀소리 낱자의 순서와 이름
    ㅏ(아), ㅑ(야), ㅓ(어), ㅕ(여), ㅗ(오), ㅛ(요), ㅜ(우), ㅠ(유), ㅡ(으), ㅣ(이), ᆞ(아래아)
    이 목록에 없는 겹글자의 경우에도, 각각의 홑글자의 경우와 마찬가지로 자형 순으로 그 순서를 사용하면 된다. ISO/IEC 10646:2003과 ISO/IEC 10646:2003-Amendment 5에 배열되어 있는 모든 한글 낱자의 부호값과 이름은 부속서 A와 같다.
  • 조항
    8.2 바뀐 한글 낱자의 순서와 이름
    (ISO/IEC 10646:2003-Amendment) 5부터는 10과 같이 U+11EC∼U+11EF까지 4개의 한글 낱자에 대하여 주석(annotation)을 통하여 그 이름이 바뀌었다.
    표 10 ― 이름이 바뀐 한글 낱자
    이는 ‘ㅇ(이응)'으로 시작하는 잘못된 옛한글 낱자의 이름을 ‘ᅌ(옛이응)'으로 바로잡은 것으로서, 이들 네 개의 한글 낱자는 ㅇ에 속하는 것이 아닌, ᅌ에 속하는 것으로 구현하고 처리해야 한다. 따라서 한글 폰트를 작성할 때에는 글꼴의 모양을 ᅌ으로 만들어야 하며, 정렬을 할 때에도 ᅌ 뒤쪽으로 순서가 지정되어야 한다.
  • 조항
    8.3 한글 낱자와 한글 글자마디의 정렬 순서
    기본적으로 한글 낱자와 한글 글자마디 간에는 한글 닿소리 글자가 먼저 나오고, 연이어서 한글 글자마디가 나오고, 끝으로 한글 홀소리 글자가 나오는 것이 한글 맞춤법에서 정한 사전의 순서이다.
    1) 한글 낱자와 현대한글 글자마디만을 사용한 예
       보기 
    2) 한글 낱자와 옛한글을 포함한 모든 글자마디를 사용한 예
       보기 
  • 조항
    8.4 여러 종류의 한글 낱자와 한글 글자마디의 정렬 순서
    UCS에는 여러 종류의 한글 낱자가 배치되어 있고 한글 글자마디와 함께 정렬이 이루어지게 된다. 따라서 이들 한글 낱자와 한글 포함 기호가 한글 글자마디와 각각의 순서를 가지고 정렬되어야 한다. 그러나 각 글자의 종류에 따른 정렬 순서에 대한 표준이나 고시 등과 같은 공인된 규정이 없기 때문에 이 규격에서는 다음과 같은 정렬 순서를 하나의 예로 들어 권고한다.
    1) 조합 한글 첫소리 낱자:U+1100 ᄀ 한글 첫소리 낱자 기역
    2) 조합 한글 끝소리 낱자:U+11A8 ᆨ 한글 끝소리 낱자 기역
    3) 반각 한글 닿소리 낱자:U+FFA1 ㄱ 반각 한글 낱자 기역
    4) 호환 한글 닿소리 낱자:U+3131 ㄱ 호환 한글 낱자 기역
    5) 괄호 안 한글 닿소리 낱자:U+3200 ㈀ 괄호 안 한글 낱자 기역
    6) 동그라미 안 한글 닿소리 낱자:U+3260 ㉠ 동그라미 안 한글 낱자 기역
    7) 한글 글자마디:U+AC00 가 한글 글자마디 가
    8) 괄호 안 한글 글자마디:U+320E ㈎ 괄호 안 한글 글자마디 가
    9) 동그라미 안 한글 글자마디:U+326E ㉮ 동그라미 안 한글 글자마디 가
  • 조항
    8.5 한글의 정렬 알고리즘
    한글 낱자와 한글 포함 기호, 한글 글자마디의 정렬에 관련된 알고리즘은 부속서 C를 참조한다.
     
  • 부속서 A
  • 한글 낱자 표와 이름
  • 조항
    A.1 한글 낱자 표와 이름
  • 조항
    A.1.1 조합 한글 낱자 표와 이름
    1) UCS의 한글 낱자(Hangul Jamo) 영역인 U+1100∼U+11FF에 배치된 한글 낱자는 A.1과 같다.
    2) UCS의 한글 확장 자모 A(Hangul Jamo Exteded A) 영역인 U+A960∼U+A97F에 배치된 한글 낱자는 A.2와 같다.
    3) UCS의 한글 자모 확장 B(Hangul Jamo Extended-B) 영역인 U+D7B0∼U+D7FF에 배치된 한글 낱자는 A.2와 같다.
  • 조항
    A.1.2 호환 한글 낱자와 반각 한글 낱자
    1) UCS의 한글 호환 자모(Hangul Compatibility Jamo) 영역인 U+3131∼U+318E에 배치된 한글 낱자는 A.3과 같다.
    2) UCS의 괄호 안 문자와 동그라미 안 문자(Enclosed CJK Letters and Months) 영역인 U+3200∼U+32FF에 배치된 괄호 안 한글 낱자와 글자마디, 동그라미 안 한글 낱자와 글자마디는 A.3과 같다.
    3) UCS의 반각 한글 낱자(Halfwidth Hangul Letter) 영역인 U+FFA0∼U+FFDC에 배치된 한글 낱자는 A.3과 같다.
    표 A.1
    표 A.1(계속)
    표 A.1(계속)
    표 A.1(계속)
    표 A.1(계속)
    표 A.1(계속)
    표 A.1(계속)
    표 A.1(계속)
    표 A.2
    표 A.2(계속)
    표 A.2(계속)
    표 A.2(계속)
    표 A.3
    표 A.3(계속)
    표 A.3(계속)
    표 A.3(계속)
     
    표 A.3(계속)
    표 A.3(계속)
    표 A.3(계속)
  • 부속서 B
  • 한글의 정규화 처리 알고리즘
  • 조항
    B.1 한글 글자마디의 정규화
    UCS에서 정의된 두 가지 방법의 한글 글자마디 표현방법(조합형 한글 글자마디, 완성형 한글 글자마디)을 사용함에 있어서 소프트웨어의 내부처리를 위하여, 손쉬운 알고리즘을 사용하여 한글 글자마디를 분해하고, 조립할 수 있다. 따라서 이 장에서는 그러한 처리 알고리즘을 예로 들고자 한다.
  • 조항
    B.1.1 일반 상수(Common Constants)
    부속서 전반에 걸친 알고리즘에서 사용하는 일반 상수를 다음과 같이 정의한다.
    static int
        SBase = 0xAC00, LBase = 0x1100, VBase = 0x1161, TBase = 0x11A7,
        LCount = 19, VCount = 21, TCount = 28, TCountAll = 83,
        NCount = VCount * TCount,  // 588
        SCount = LCount * NCount;  // 11172
  • 조항
    B.1.2 일반 함수(Common Functions)
    부속서 전반에 걸친 알고리즘에서 사용하는 일반 함수를 다음과 같이 정의한다.
      public static class UChar
      {
         // 현대한글 첫소리 낱자인가?
         public static bool isModernChoseong(char L) {
           return (0x1100 <= L && L < 0x1112) ? true : false;
         }
         // 한글 첫소리 낱자인가?
         public static bool isChoseongJamo(char L) {
           return (0x1100 <= L && L <= 0x115F) || (0xA960 <= L && L <= 0xA97C) ? true : false;
         }
         // 현대한글 가운뎃소리 낱자인가?
         public static bool isModernJungseong(char V) {
           return (0x1160 < V && V <= 0x1175) ? true : false;
         }
         // 한글 가운뎃소리 낱자인가?
         public static bool isJungseongJamo(char V) {
           return (0x1160 <= V && V <= 0x11A7) || (0xD7B0 <= V && V <= 0xD7C6) ? true : false;
         }
         // 현대한글 끝소리 낱자인가?
         public static bool isModernJongseong(char T) {
           return (0x11A8 <= T && T <= 0x11C2) ? true : false;
         }
         // 옛한글 끝소리 낱자인가?
         public static bool isOldJongseong(char T) {
           return (0x11C3 <= T && T <= 0x11FF) || (0xD7CB <= T && T <= 0xD7FB) ? true:false;
         }
         // 한글 끝소리 낱자인가?
         public static bool isJongseongJamo(char T) {
           return (0x11A8 <= T && T <= 0x11FF) || (0xD7CB <= T && T <= 0xD7FB) ? true : false;
         }
         // 조합 한글 낱자인가?
         public static bool isHangulJamo(char C) {
           return (0x1100 <= C && C <= 0x11FF) || (0xA960 <= C && C <= 0xA97C) ||
              (0xD7B0 <= C && C <= 0xD7C6) || (0xD7CB <= C && C <= 0xD7FB) ? true : false;
         }
         // 반각 한글 낱자인가?
         public static bool isHalfwidthLetter(char C) {
           return (0xFFA0 <= C && C <= 0xFFDF) ? true : false;
         }
         // 호환 한글 낱자인가?
         public static bool isCompatibilityLetter(char C) {
           return (0x3131 <= C && C <= 0x318E) ? true : false;
         }
         // 괄호 안 한글 낱자와 글자마디인가?
         public static bool isParenthesizedLetter(char C) {
           return (0x3200 <= C && C <= 0x321F) ? true : false;
         }
         // 동그라미 안 한글 낱자와 글자마디인가?
         public static bool isCircledLetter(char C) {
           return (0x3260 <= C && C <= 0x327F) ? true : false;
         }
         // 완성형 한글 글자마디인가?
         public static bool isPrecomposedSyllable(char S) {
           return (0xAC00 <= S && S <= 0xd7A3) ? true : false;
         }
         // 한글 관련 글자인가?
         public static bool isHangulLetter(char S) {
           if (isPrecomposedSyllable(S)) return true;
           if (isHangulJamo(S)) return true;
           if (isCompatibilityLetter(S)) return true;
           if (isParenthesizedLetter(S)) return true;
           if (isCircledLetter(S)) return true;
           if (isHalfwidthLetter(S)) return true;
           return false;
         }
       }
  • 조항
    B.1.3 한글 분해(Hangul Decomposition)
    완성형 현대한글 글자마디를 입력으로 하여 조합형 한글 글자마디를 돌려주는 함수이다.
    public static String decomposeHangul(char S) {
       int SIndex=S-SBase;
        if (SIndex < 0 || SIndex >= SCount)
          return S.ToString();
        
        StringBuilder result = new StringBuilder();
        int L=LBase+SIndex / NCount;
        int V=VBase+(SIndex % NCount) / TCount;
        int T=TBase+SIndex % TCount;
        result.Append((char)L);
        result.Append((char)V);
        if (T !=TBase) result.Append((char)T);
        return result.ToString();
      }
  • 조항
    B.1.4 한글 조립(Hangul Composition)
    조합형 현대한글 글자마디를 완성형 현대한글 글자마디로 바꾸어 주는 함수이다. UAX #15와는 달리 옛한글의 일부분이 현대한글의 글자마디를 이루어도, 그 부분을 완성형 현대한글로 바꾸지 않도록 처리되어 있다.
    public static String composeHangul(String source)
      {
        int len = source.Length;
        if (len == 0) return "";
        StringBuilder result = new StringBuilder();
        char last = source[0];      // 첫 번째 글자 복사
        result.Append(last);
        for (int i = 1; i < len; ++i) {
          char ch = source[i];
          // 1. 연속되는 두 글자가 한글 첫소리, 가운뎃소리 글자인가?
          int LIndex = last-LBase;
          if (0 <= LIndex && LIndex < LCount) {
            int VIndex = ch-VBase;
            if (0 <= VIndex && VIndex < VCount) {
              // 끝소리 글자 없는 완성형 현대한글로 바꾼다.
              last = (char)(SBase + (LIndex * VCount+VIndex) * TCount);
              result[result.Length-1] = last; // last 초기화
              continue; // ch 버림
            }
          }
          // 2. 완성형 현대한글+끝소리 낱자인지 살핀다.
          int SIndex=last-SBase;
          if (0 <=SIndex && SIndex < SCount && (SIndex % TCount)==0) {
            int TIndex=ch-TBase;
            if (0 < TIndex && TIndex < TCount) {
              // 끝소리 글자 있는 완성형 현대한글로 바꾼다.
              last+=(char)TIndex;
              result[result.Length -1]=last; // last 초기화
              continue; // ch 버림
            }
            // 끝소리 낱자가 옛한글이면
            if (UChar. isOldJongseong(ch)) {
            // 완성형 현대한글을 첫소리와 가운뎃소리로 쪼갠다.
              int L = LBase+SIndex / NCount;
              int V = VBase+(SIndex % NCount) / TCount;
              result[result.Length-1]=(char)L; // L을 더한다.
              result.Append((char)V);
              result.Append(ch);
              continue; // ch 버림
            }
          }
          last = ch;
          result.Append(ch);
        }
        return result.ToString();
      }
  • 조항
    B.1.5 한글 재조립(Hangul Recomposition)
    만일 정규화 처리의 composeHangul 함수가 위와 같이 작성하지 않고 UAX #15의 알고리즘을 그대로 사용하는 경우, 옛한글 글자마디의 일부가 완성형 한글 글자마디와 조합 한글 끝소리 낱자로 분리되는 현상이 발생할 수 있다. 그러한 경우에는 정규화 형식 NFC 혹은 NFKC를 수행하고 난 후에 다음과 같은 재조립 알고리즘을 통하여 다시 L V T의 형태로 복원하면 된다.
    public static String recomposeHangul(String source)
      {
        int len = source.Length;
        if (len == 0) return " ";
        StringBuilder result = new StringBuilder();
        char last = source[0];      // 첫 번째 글자 복사
        result.Append(last);
        for (int i=1; i < len; ++i) {
          char ch=source[i];
          // 완성형 현대한글+끝소리 낱자인지 살핀다.
          int SIndex=last-SBase;
          if (0 <=SIndex && SIndex < SCount && (SIndex % TCount) == 0) {
            // 끝소리 낱자가 옛한글이면
          if (UChar. isOldJongseong(ch)) {
          // 완성형 현대한글을 첫소리와 가운뎃소리로 쪼갠다.
              int L=LBase+SIndex / NCount;
              int V=VBase+(SIndex % NCount) / TCount;
              result[result.Length-1]=(char)L; // L을 더한다.
              result.Append((char)V);
              result.Append(ch);
              continue; // ch 버림
            }
          }
          // 위의 경우가 아니면, 그냥 ch를 더한다.
          last = ch;
          result.Append(ch);
        }
        return result.ToString();
      }
  • 조항
    B.2 한글 낱자 및 한글 기호의 정규화(Hangul Jamo Normalize)
    호환 한글 낱자와 반각 한글 낱자 그리고 괄호 안 한글 낱자와 글자마디, 동그라미 안 한글 낱자와 글자마디를 정규화 형식 KD, KC 형식으로 변환할 때 미리 채움 문자를 사용하여 올바른 한글 글자마디 형태로 처리하는 알고리즘이다.
  • 조항
    B.2.1 호환 한글 낱자의 변환
    KD, KC 형식에서는 호환 한글 낱자를 조합 한글 낱자로 변환하여야 한다. 변환은 다음의 테이블을 참조하여 수행한다.
      // 호환 한글 낱자의 조합 한글 낱자로의 변환표(0x3131-0x318E)
      uint[ ] CPJAMO = new uint[ ] {
    0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, 0x1104, 0x1105, 0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E,
    0x110F, 0x1110, 0x1111, 0x1112, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0x116D, 0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1160, 0x1114, 0x1115, 0x11C7, 0x11C8, 0x11CC, 0x11CE, 0x11D3, 0x11D7, 0x11D9, 0x111C,
    0x11DD, 0x11DF, 0x111D, 0x111E, 0x1120, 0x1122, 0x1123, 0x1127, 0x1129,
    0x112B, 0x112C, 0x112D, 0x112E, 0x112F, 0x1132, 0x1136, 0x1140, 0x1147,
    0x114C, 0x11F1, 0x11F2, 0x1157, 0x1158, 0x1159, 0x1184, 0x1185, 0x1188,
    0x1191, 0x1192, 0x1194, 0x119E, 0x11A1,
      };
  • 조항
    B.2.2 반각 한글 낱자의 변환
    KD, KC 형식에서는 반각 한글 낱자를 조합 한글 낱자로 변환하여야 한다. 변환은 다음의 테이블을 참조하여 수행한다.
      // 반각 한글 낱자의 조합 한글 낱자로의 변환표(0xFFA0-0xFFDF)
      uint[ ] HWJAMO = new uint[ ] {
    0x1160, 0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, 0x1104, 0x1105, 0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F, 0x1110, 0x1111, 0x1112, 0xFFBF, 0xFFC0, 0xFFC1, 0x1161, 0x1162, 0x1163, 0x1164, 0x1165, 0x1166, 0xFFC8, 0xFFC9, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0xFFD0, 0xFFD1, 0x116D, 0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0xFFD8, 0xFFD9, 0x1173, 0x1174, 0x1175, 0xFFDD, 0xFFDE, 0xFFDF,
      };
  • 조항
    B.2.3 괄호 안 한글 낱자, 동그라미 안 한글 낱자의 변환
    KD, KC 형식에서는 괄호 안 한글 낱자와 동그라미 안 한글 낱자에 포함된 한글 낱자를 조합 한글 낱자로 변환하여야 한다. 변환은 다음의 테이블을 참조하여 수행한다.
      // 괄호 안 한글 낱자, 동그라미 안 한글 낱자 변환표(0x3200-0x320D, 0x3260-0x326D)
      uint[ ] PCJAMO = new uint[ ] {
    0x1100, 0x1102, 0x1103, 0x1105, 0x1106, 0x1107, 0x1109, 0x110B, 0x110C, 0x110E, 0x110F, 0x1110, 0x1111, 0x1112,
      };
  • 조항
    B.2.4 한글 낱자 및 한글 기호의 정규화(Hangul Jamo Normalize)
    public static String NormalizeJamoKDKC(String source)
      {
        int PHBase = 0x3200, PHEnd = 0x320D;
        int CHBase = 0x3260, CHEnd = 0x326D;
        int len = source.Length;
        if (len == 0) return " ";
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < len; ++i) {
          int ch = source[i];
          int pf = 0;
          // 1. 테이블을 통해 조합 한글 낱자로 바꾼다.
          if (UChar.isCompatibilityLetter(ch))
            ch = CPJAMO[ch - 0x3131];
          else if (PABase <= ch && ch <= PAEnd) {
            result.Append((char)0x0028);
            ch = PCJAMO [ch - PABase];
            pf = 0x0029;
          }
          else if (CHBase <= ch && ch <= CHEnd)
            ch = PCJAMO [ch - CHBase];
          else if (UChar.isHalfwidthLetter(ch))
            ch = HWJAMO[ch - 0xFFA0];
          else {
            result.Append((char)ch);
            continue;
          }
          // 2. 채움문자를 삽입한다.
          if (LBase <= ch && ch < (LBase + LCount)) {
            result.Append((char)ch);
            result.Append((char)0x1160);
          }
          else if (VBase <= ch && ch < (VBase + VCount)) {
            result.Append((char)0x115F);
            result.Append((char)ch);
          }
          else if (TBase <= ch && ch < (TBase + TCount)) {
            result.Append((char)0x115F);
            result.Append((char)0x1160);
            result.Append((char)ch);
          }
          // 3. 괄호 안 한글 글자에 대한 특별 처리
          if (pf != 0) result.Append((char)pf);
        }
        return result.ToString();
      }
     
  • 부속서 C
  • 한글 정렬 알고리즘
  • 조항
    C.1 한글 정렬의 전처리
  • 조항
    C.1.1 호환 한글 낱자의 변환
    호환 한글 낱자를 조합 한글 낱자 혹은 한글 글자마디와 함께 정렬하기 위해서는 우선 조합 한글 낱자로 변환하여야 한다. 변환은 다음의 테이블을 참조하여 수행한다.
      // 호환 한글 낱자의 조합 한글 낱자로의 변환표(0x3131-0x318E)
      uint[ ] CPJAMO = new uint[ ] {
    0x1100, 0x1101, 0x11AA, 0x1102, 0x11AC, 0x11AD, 0x1103, 0x1104, 0x1105,
    0x11B0, 0x11B1, 0x11B2, 0x11B3, 0x11B4, 0x11B5, 0x111A, 0x1106, 0x1107, 0x1108, 0x1121, 0x1109, 0x110A, 0x110B, 0x110C, 0x110D, 0x110E, 0x110F, 0x1110, 0x1111, 0x1112, 0x1161, 0x1162, 0x1163, 0x1164,  0x1165, 0x1166, 0x1167, 0x1168, 0x1169, 0x116A, 0x116B, 0x116C, 0x116D, 0x116E, 0x116F, 0x1170, 0x1171, 0x1172, 0x1173, 0x1174, 0x1175, 0x1160, 0x1114, 0x1115,  0x11C7, 0x11C8, 0x11CC, 0x11CE,0x11D3, 0x11D7, 0x11D9, 0x111C, 0x11DD, 0x11DF, 0x111D, 0x111E, 0x1120, 0x1122, 0x1123, 0x1127, 0x1129, 0x112B, 0x112C, 0x112D, 0x112E, 0x112F, 0x1132, 0x1136, 0x1140, 0x1147, 0x114C, 0x11F1, 0x11F2, 0x1157,  0x1158, 0x1159, 0x1184, 0x1185, 0x1188, 0x1191, 0x1192, 0x1194, 0x119E, 0x11A1,
      };
    변환을 완료한 뒤, 조합 한글 낱자의 순서 테이블을 참조하여, 낱자의 순서를 구한다.
  • 조항
    C.1.2 반각 한글 낱자의 변환
    반각 한글 낱자를 조합 한글 낱자 혹은 한글 글자마디와 함께 정렬하기 위해서는 우선 조합 한글 낱자로 변환하여야 한다. 변환은 다음의 테이블을 참조하여 수행한다.
      // 반각 한글 낱자의 조합 한글 낱자로의 변환표(0xFFA0-0xFFDF)
      uint[ ] HWJAMO = new uint[ ] {
    0x1160,
    0x1100,
    0x1101,
    0x11AA,
    0x1102,
    0x11AC,
    0x11AD,
    0x1103,
    0x1104,
    0x1105,
    0x11B0,
    0x11B1,
    0x11B2,
    0x11B3,
    0x11B4,
    0x11B5,
    0x111A,
    0x1106,
    0x1107,
    0x1108,
    0x1121,
    0x1109,
    0x110A,
    0x110B,
    0x110C,
    0x110D,
    0x110E,
    0x110F,
    0x1110,
    0x1111,
    0x1112,
    0xFFBF,
    0xFFC0,
    0xFFC1,
    0x1161,
    0x1162,
    0x1163,
    0x1164,
    0x1165,
    0x1166,
    0xFFC8,
    0xFFC9,
    0x1167,
    0x1168,
    0x1169,
    0x116A,
    0x116B,
    0x116C,
    0xFFD0,
    0xFFD1,
    0x116D,
    0x116E,
    0x116F,
    0x1170,
    0x1171,
    0x1172,
    0xFFD8,
    0xFFD9,
    0x1173,
    0x1174,
    0x1175,
    0xFFDD,
    0xFFDE,
    0xFFDF,







    };
    변환을 완료한 뒤, 조합 한글 낱자의 순서 테이블을 참조하여, 낱자의 순서를 구한다.
  • 조항
    C.1.3 괄호 안 한글 낱자와 글자마디의 변환
    괄호 안 한글 낱자와 글자마디를 조합 한글 낱자 혹은 한글 글자마디와 함께 정렬하기 위해서는 우선 조합형 한글 낱자 혹은 한글 글자마디로 변환하여야 한다. 변환은 다음의 테이블을 참조하여 수행한다.
      // 괄호 안 한글 낱자와 글자마디의 조합 한글 낱자/한글 글자마디 변환표(0x3200-0x321F)
      uint[ ] PACHAR = new uint[ ] {
    0x1100,
    0x1102,
    0x1103,
    0x1105,
    0x1106,
    0x1107,
    0x1109,
    0x110B,
    0x110C,
    0x110E,
    0x110F,
    0x1110,
    0x1111,
    0x1112,
    0xAC00,
    0xB098,
    0xB2E4,
    0xB77C,
    0xB9C8,
    0xBC14,
    0xC0AC,
    0xC544,
    0xC790,
    0xCC28,
    0xCE74,
    0xD0C0,
    0xD30C,
    0xD558,
    0xC8FC,
    0x321D,
    0x321E,
    0x321F,









      };
    변환을 완료한 뒤, 조합 한글 낱자의 순서 테이블을 참조하여, 낱자의 순서를 구한다.
  • 조항
    C.1.4 동그라미 안 한글 낱자와 글자마디의 변환
    동그라미 안 한글 낱자와 글자마디를 조합 한글 낱자 혹은 한글 글자마디와 함께 정렬하기 위해서는 우선 조합 한글 낱자 혹은 한글 글자마디로 변환하여야 한다. 변환은 다음의 테이블을 참조하여 수행한다.
      // 동그라미 안 한글 낱자와 글자마디의 조합 한글 낱자/한글 글자마디 변환표(0x3260-0x327F)
      uint[ ] CLCHAR = new uint[ ] {
    0x1100,
    0x1102,
    0x1103,
    0x1105,
    0x1106,
    0x1107,
    0x1109,
    0x110B,
    0x110C,
    0x110E,
    0x110F,
    0x1110,
    0x1111,
    0x1112,
    0xAC00,
    0xB098,
    0xB2E4,
    0xB77C,
    0xB9C8,
    0xBC14,
    0xC0AC,
    0xC544,
    0xC790,
    0xCC28,
    0xCE74,
    0xD0C0,
    0xD30C,
    0xD558,
    0x327C,
    0x327D,
    0xCB60,
    0x326F,









      };
    변환을 완료한 뒤, 조합 한글 낱자의 순서 테이블을 참조하여, 낱자의 순서를 구한다.
  • 조항
    C.2 조합 한글 낱자의 순서
  • 조항
    C.2.1 조합 한글 낱자의 순서 표
    1) UCS의 한글 자모 영역(Hangul Jamo)인 U+1100∼U+11FF, 한글 확장 자모 A 영역(Hangul Jamo Exteded A)인 U+A960∼U+A97F, 한글 자모 확장 B 영역(Hangul Jamo Extended-B)인 U+D7B0∼U+D7FF에 배치된 조합 한글 낱자에 대하여 닿소리의 순서는 C.2에 실려있다. 닿소리는 첫소리와 가운뎃소리 낱자를 자형에 따라 같이 배열하여 차례를 구하고 있다.
    2) 같은 영역에 배치된 조합 한글 낱자에 대하여 홀소리의 순서는 C.3에 실려있다.
  • 조항
    C.2.2 조합 한글 낱자의 순서 테이블
    C.2, C.3에 근거하여 작성된 조합 한글 낱자의 순서 테이블은 다음과 같다. 이 테이블은 정렬 시에 비교 횟수를 줄여서 속도를 빠르게 하기 위하여, 첫소리, 가운뎃소리, 끝소리 낱자의 순서가 아닌, UCS에 배열된 영역별로 구성되어 있다.
  • 조항
    C.3 한글 글자의 정렬 가중 값
  • 조항
    C.3.1 가중 값의 구성 방법
    UCS의 한글 낱자의 부호값을 가지고 직접 정렬을 하기에는 여러 가지 문제점이 있다. 첫째로는 현대한글 낱자와 옛한글 낱자가 부호값 순서대로 정렬되어 배치되지 않은 것이고, 둘째로는 여러 영역에 한글 낱자가 배열되어 있는 점이고, 셋째로는 완성형 한글 글자마디와 조합형 글자마디가 섞여있는 것이다. 따라서, 한글 낱자 혹은 한글 글자마디를 입력으로 하여 다음과 같은 방법으로 가중 값을 작성하여 비교를 하여야 한다.
    표 C.1 - 한글 글자에 대한 정렬 가중 값
    가중 값은 C.1에 나타낸 것과 같이 32비트로 이루어지며, 첫 바이트는 첫소리 글자에 대한 순서 값이고, 두 번째 바이트는 가운뎃소리 글자에 대한 순서 값, 세 번째 바이트는 끝소리 글자에 대한 순서 값으로 이루어진다. 마지막 네 번째 바이트는 한글 글자의 종류에 따라 순서를 정하기 위해서 사용하며, 본문의 8.4에서 지정한 순서에 따라서 다음과 같은 값을 예로 가진다.
    1) 조합형 한글 글자마디 혹은 완성형 한글 글자마디는 0을 가진다.
    2) 한글 끝소리 낱자만 있는 경우에는 1을 가진다.
    3) 반각 한글 낱자의 경우에는 2를 가진다.
    4) 호환 한글 낱자의 경우에는 3을 가진다.
    5) 괄호 안 한글 문자의 경우에는 4를 가진다.
    6) 동그라미 안 한글 문자의 경우에는 5를 가진다.
  • 조항
    C.3.2 조합형 한글 글자마디의 정렬 가중 값 구하기
    조합형 한글 글자마디를 첫소리, 가운뎃소리, 끝소리 낱자로 나누어 입력으로 하여 가중 값을 구하는 알고리즘이다. 첫소리와 가운뎃소리 낱자가 없을 때는 각각의 채움문자를 입력으로 하고, 끝소리 글자가 없을 경우에는 0을 입력으로 넣는다.
      // 첫소리, 가운뎃소리, 끝소리 글자로 정렬 가중 값을 얻는다.
    public uint getHangulWeight(char L, char V, char T)
    {
        uint weight = 0, type = 0;
        uint LW = 0, VW = 0, TW = 0;
        // 한글 첫소리 낱자인가?
        if (UChar.isChoseongJamo(L)) {
          // 한글 가운뎃소리 낱자인가?
          if (UChar.isJungseongJamo(V)) {
            // 한글 끝소리 낱자인가?
            if ((T == 0) || UChar.isJongseongJamo(T)) {
              // 가중 값을 계산한다.
              LW = (L < 0x1200) ? INDEX1100[L-0x1100] : INDEXA960[L-0xA960];
              VW = (V < 0x1200) ? INDEX1100[V-0x1100] : INDEXD7B0[V-0xD7B0];
              if (T != 0)
                TW=(T < 0x1200) ? INDEX1100[T-0x1100] : INDEXD7CB[T-0xD7CB];
              // 끝소리 낱자만 있는 경우, 첫소리 낱자에 맞추어 계산한다.
              if (L == 0x115F && V == 0x1160 && T != 0)
                weight = (TW << 24)+type;
              else
                weight = (LW << 24)+(VW << 16)+(TW << 8)+type;
            }
          }
        }
        return weight;
      }
  • 조항
    C.3.3 완성형 한글 글자마디와 기타 한글 낱자의 정렬 가중 값 구하기
    완성형 한글 글자마디 혹은 한글 낱자와 한글 포함 기호를 입력으로 하여 가중 값을 구하는 알고리즘이다. 한글이 아닌 글자가 입력으로 들어간 경우에는 가중 값에 0을 돌려준다. 즉, 한글이 아닌 문자와 한글에 대한 비교는 이 알고리즘의 고려 대상이 아니다.
      // 완성형 한글 글자마디와 한글 낱자, 한글 포함 기호로 정렬 가중 값을 얻는다.
    public uint getHangulWeight(char hc)
      {
        uint type = 0, index = hc, weight = 0;
        uint LW = 0, VW = 0, TW = 0;
        uint L = 0x115F, V = 0x1160, T = 0;
        // 한글 끝소리 낱자인가?
        if (UChar.isJongseongJamo(hc)) {
          type = 1;
          T = hc;
        }
        // 반각 한글 낱자인가?
        else if (UChar.isHalfwidthLetter(hc)) {
          type = 2;
          index = HWJAMO[hc-0xFFA0];
          if (index == hc) return 0;   // Not a Hangul char
        }
        // 호환 한글 낱자인가?
        else if (UChar.isCompatibilityLetter(hc)) {
          type = 3;
          index = CPJAMO[hc-0x3131];
        }
        // 괄호 안 한글 문자인가?
        else if (UChar.isParenthesizedLetter(hc)) {
          type = 4;
          index = PACHAR[hc-0x3200];
          if (index == hc) return 0;   // Not a Hangul char
        }
        // 동그라미 안 한글 문자인가?
        else if (UChar.isCircledLetter(hc)) {
          type = 5;
          index = CLCHAR[hc-0x3260];
          if (index == hc) return 0;   // Not a Hangul char
        }
        // 한글 첫소리 낱자인가?
        if (UChar.isChoseongJamo(index))
          L = index;
        // 한글 가운뎃소리 낱자인가?
        else if (UChar.isJungseongJamo(index))
          V = index;
        // 한글 끝소리 낱자인가?
        else if (UChar.isJongseongJamo(index))
          T = index;
        // 완성형 한글 글자마디이면, LVT로 변환
        else if (UChar.isPrecomposedSyllable(index)) {
          uint SIndex = index-(uint)SBase;
          L = (uint)(LBase+SIndex / NCount);
          V = (uint)(VBase+(SIndex % NCount) / TCount);
          T = (uint)(TBase+SIndex % TCount);
          if (T == TBase) T = 0;
        }
        // 한글 관련 글자가 아니다.
        else return 0;  // Not Hangul char
        // 가중 값을 계산한다.
        LW = (L < 0x1200) ? INDEX1100[L-0x1100] : INDEXA960[L-0xA960];
        VW = (V < 0x1200) ? INDEX1100[V-0x1100] : INDEXD7B0[V-0xA960];
        if (T != 0)
          TW = (T < 0x1200) ? INDEX1100[T-0x1100] : INDEXD7CB[T-0xD7CB];
        // 끝소리 낱자만 있는 경우, 첫소리 낱자에 맞추어 계산한다.
        if (L == 0x115F && V == 0x1160 && T != 0)
          weight = (TW << 24)+type;
        else
          weight = (LW << 24)+(VW << 16)+(TW << 8)+type;
        
        return weight;
      }
    표 C.2 - 한글 닿소리 순서
    표 C.3 - 한글 홀소리 순서