안녕하세요,

러시아에서 아주 가끔 코딩을 하는 개발자 윤진입니다.


유니코드를 뒤적뒤적 살펴보다가,

유니코드에 한글이 어떻게 매핑되어 있는지 궁금해졌습니다.


유니코드에 매핑된 문자를 확인하고 싶으면 유니코드 공식홈페이지를 찾으면 됩니다.

공식 홈페이지에 올라와있는 Unicode 9.0 Character Code Charts에는,

한글 자소와 완성형 한글이 45장에 걸쳐 빽빽하게 기록된 것을 볼 수 있습니다.


한글자소는 초성/중성/종성으로 나눠져 세 그룹으로 표현되어 있습니다.

현대 한글에서 사용하는 초성은,

'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'로 총 19자입니다.

그렇지만, 한글자소 테이블에는 위의 한글 외에도 기이한 형태의 자음이 복합된 초성이 포함되어 있습니다.

'ㅎ'에 이어서 'ㄴㄱ'이나 'ㄴㄴ', 'ㄴㄷ', 'ㄴㅂ'이 연이어 초성으로 등장하는데요.

어떻게 읽으면 좋을지 감도 떠오르지 않는 문자들이 이어집니다.

무언가 규칙이 있는 것으로 보이는데 쉽게 읽히지는 않습니다.


중성도 한국의 사전순서를 따르고 있습니다.

'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ' 총 21자의 모음이 등장합니다.

그리고 초성과 마찬가지로 가지각색의 이중모음이 뒤따르고 있습니다.


종성도 실제 사용하는 한글부터 등장합니다.

'ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ' 총 27자의 받침이 나오고,

사용하지 않는 복합자음이 연이어 나옵니다.

초성과 중성까지 쓰여진 문자에는 종성이 붙지 않거나 27가지 중 한가지 받침이 붙을 수 있습니다.

곧, 종성에는 28가지 경우의 수가 나오게 됩니다.


따라서 완성형 한글을 모두 테이블에 기입하기 위해서는,

초성자음 19자 * 중성모음 21자 * 종성자음(무받침 포함) 28 = 11,172글자

16*16 사이즈의 테이블에는 총 256글자가 들어가니,

11,172글자를 모두 테이블에 담기 위해서는 16*16 테이블 44개가 필요합니다.


물론 11,172글자 중에는 실제로 사용되지 않는 글자도 많이 있습니다.

'퐓, 풺, 햤' 이런 글자는 평소에 구경해본 적도 없습니다.

그렇지만, 유니코드는 사용여부가 아니라, 그저 조합 가능한 모든 경우를 따져 한글코드를 배치하였습니다.

그렇기 때문에 초성/중성/종성 자소만 가지고 완성형 글자의 위치를 쉽게 파악할 수 있습니다.


한글시작위치는 U+AC00로 여기에는 '가'가 매핑되어 있습니다.

그리고 '각갂갃간...' 등 총 28가지의 종성 경우의 수를 지나 29번째에 '개'가 나옵니다.

다시 28개를 지나면 '갸'가 등장합니다.

중성은 총 21개이기 때문에, 'ㄱ'이란 초성이 들어가는 글자는 21 * 28 = 588글자입니다.


'가'가 첫번째에 등장했다면,

'나'는 589번째에 등장하고,

'다'는 1177번째에 등장합니다.

이런 논리라면 한글자모만으로 완성형 글자의 위치를 얻거나

역으로 완성형 코드를 보고 어떤 자모인지 찾을 수 있습니다.



한글_베이스 U+AC00
중성_경우의_수 21
종성_경우의_수 28

함수 자소합치기(초성, 중성, 종성)
{
	완성형글자 = 한글베이스 +
		(초성 * 중성_경우의_수 * 종성_경우의_수) +
		(중성 * 종성_경우의 수) + 종성;
}

함수 자소나누기(완성형글자)
{
	초성 = (완성형글자 - 한글_베이스) /
		(중성_경우의_수 * 종성_경우의_수);

	중성 = (완성형글자 - 한글_베이스) %
		(중성_경우의_수 * 종성_경우의_수) / 종성_경우의_수;

	종성 = (완성형글자 - 한글_베이스) %
		종성_경우의_수;
}


원리를 명확하게 파악하기 위해,

위와 같이 코드를 풀어썼는데 반복되는 루틴이 많으니 실제로 코드에 옮길때는 최적화가 필요하겠네요.


그럼 오늘은 여기서 줄입니다.

좋은 하루 보내세요.



안녕하세요,

러시아에 살고 있는 개발자 윤진입니다.


C#을 비롯한 .Net 플랫폼에서는 문자를 인코딩하는 방식으로,

Unicode Transformation Format인 UTF-16을 사용합니다.


UTF-16은 기본적으로 16비트-2바이트를 취하지만, 항상 2바이트는 아닙니다.

사상되는 문자의 종류에 따라 4바이트로 확장되기도 합니다.


2바이트로 표현되는 영역은 U+0000부터 U+FFFF까지입니다.

U+0000은 제어 문자와 라틴 기본 영역에 속해있죠.

U+0000 ~ U+007F

128자

제어 문자와 라틴 기본

U+FFFF는 특수 제어 문자 영역에 속해있습니다.

U+FFF0 ~ U+FFFF

16자

특수 제어 문자            


그렇다면, 4바이트 사상되는 U+000000~ 코드 이상의 문자는 무엇을 보고 4바이트 문자인지 판별할 수 있을까요?

이는 2바이트 영역 내에 예약되어있는 '대체 영역' 코드를 통해서입니다.


UTF 코드에는 상위/하위 대체영역으로 두 영역이 할당되어 있습니다.

U+D800 ~ U+DB7F

   896자

상위 대체 영역       


U+DC00 ~ U+DFFF

1,024자

하위 대체 영역       

캐릭터 코드 2바이트를 읽을때 U+D800~U+DB7F 영역을 의미하는 비트 '1101 1000'이 나오면,

해당 캐릭터는 2바이트가 아닌 4바이트짜리 캐릭터로 인지됩니다.

그 다음 2바이트는 U+DC00~U+DFFF 영역을 의미하는 비트 '1101 1100'로 시작해야합니다.

그렇다면 제대로 된 4바이트짜리 UTF-16 문자가 완성되는 것입니다.


위키피디아의 예시를 보면 보다 명확하게 이해가 가는데,

U+104370001 0000 0100 0011 01111101 1000 0000 0001 1101 1100 0011 0111

2바이트 영역으로 표현할 수 없는 U+10437 유니코드를 비트로 풀어쓰면,

'0001 0000 0100 0011 0111'로 표현할 수 있습니다.

위의 20비트를 정확히 반으로 갈라서 10비트씩으로 나눕니다.

그리고 앞의 10비트는 상위 대체 영역 비트인 '1101 10'의 뒤에 붙이고,

뒤의 10비트는 하위 대체 영역 비트인 '1101 11'의 뒤에 붙입니다.


U+10000 이상의 영역에 속한 문자는 옛 그리스 문자, 옛 페르시아 문자, 페니키아 문자 등

지금은 거의 사용하지 않는 문자의 영역이지만,

U+1F600 ~ U+1F64F

80자

이모티콘

이모티콘이나 한중일 통합 한자 확장 영역 같은 경우에는 쓸 일이 있을지도 모릅니다.


UTF-16으로 표현할 수 있는 문자수는,

20비트의 공간에 채울 수 있는 1,048,576개의 문자입니다.

아직은 빈공간이 군데군데 보이지만, 언젠가는 꽉 찰지도 모를 일입니다.

유니코드 공식홈페이지에서 현재까지 채워져 있는 유니코드 테이블을 가져다 붙여보겠습니다.


 0123456789ABCDEF
100Linear B SyllabaryLinear B Ideograms
101Aegean NumbersAncient Greek NumbersAncient SymbolsPhaistos Disc
102(Iberian)???LycianCarianCoptic Ep №
103Old ItalicGothicOld PermicUgariticOld Persian¿ShavianQS?
104DeseretShavianOsmanyaOsage
105ElbasanCauc. Albanian¿Veqilharxhi (Buthakukye)?¿Todhri?
106Linear A
107Linear ACypro-Minoan
108CypriotImp.AramaicPalmyreneNabataean???¿Numidian?Hatran
109PhoenicianLydian????????????Meroitic H.Meroitic Cursive
10AKharoshthiO.S.ArabianO.N.Arabian(Balti)Manichaean
10BAvestanParthianInsc. Phlv.Psalt. Phlv.(Book Pahlavi)(Baburi)
10COld Turkic?????????Old Hungarian
10D(Hanifi Rohingya)(Garay (Wolof))¿Byblos?
10E???Rumi Symb.???¿Elymaic?
10F(Old Sogdian)(Sogdian)???(Uyghur)
110BrahmiKaithiSora Sompeng
111ChakmaMahajaniSharadaSinh Arch №
112Khojki(Landa)MultaniKhudawadi
113Grantha(Tigalari)¿Sharada Ext.?
114NewaTirhuta(Tani)
115(Ranjana)Siddham
116ModiMong. Supp.Takri(Jenticha)
117Ahom(Zou)(Pyu)
118(Dogra)¿Sirmauri????Warang Citi
119(Tolong Siki)(Tikamuli)(Khambu Rai)(Kirat Rai)
11A(Zanabazar Square)(Soyombo)???Pau Cin Hau
11B(Dhives Akuru)(Leke)(Nandinagari)???
11CBhaiksukiMarchen(Balti-B)
11D(Masaram Gondi)(Gunjala Gondi)(Kawi)
11E(Tocharian)(Khotanese)???(Makasar)
11F(Vatteluttu)??????¿Chola?(Tamil Supplement)
120Cuneiform
121Cuneiform
122Cuneiform
123Cuneiform
124Cuneiform NumbersEarly Dynastic Cuneiform
125Early Dynastic Cuneiform????????????
126(Proto-Cuneiform)
127(Proto-Cuneiform)
128(Proto-Cuneiform)
129(Proto-Cuneiform)
12A(Proto-Cuneiform)
12B(Proto-Cuneiform)
12C(Proto-Cuneiform)
12D(Proto-Cuneiform)
12E(Indus)
12F(Indus)?????????????????????
130Egyptian Hieroglyphs
131Egyptian Hieroglyphs
132Egyptian Hieroglyphs
133Egyptian Hieroglyphs
134Egyptian Hier.(Eg.Hi.FC)(Egyptian Hieroglyphs Extended-A)
135(Egyptian Hieroglyphs Extended-A)
136(Egyptian Hieroglyphs Extended-A)
137(Egyptian Hieroglyphs Extended-A)
138(Egyptian Hieroglyphs Extended-A)
139(Egyptian Hieroglyphs Extended-A)
13A(Egyptian Hieroglyphs Extended-A)
13B(Egyptian Hieroglyphs Extended-A)
13C(Egyptian Hieroglyphs Extended-A)
13D(Egyptian Hieroglyphs Extended-A)
13E(Egyptian Hieroglyphs Extended-A)
13F(Egyptian Hieroglyphs Extended-A)
140(Egyptian Hieroglyphs Extended-A)
141(Egyptian Hieroglyphs Extended-A)
142(Egyptian Hieroglyphs Extended-A)
143(Egyptian Hieroglyphs Extended-A)
144Anatolian Hieroglyphs
145Anatolian Hieroglyphs
146Anatolian Hieroglyphs(Egyptian Hieroglyphs Extended-B)
147(Egyptian Hieroglyphs Extended-B)
148(Egyptian Hieroglyphs Extended-B)
149(Egyptian Hieroglyphs Extended-B)
14A(Egyptian Hieroglyphs Extended-B)
14B(Egyptian Hieroglyphs Extended-B)
14C(Egyptian Hieroglyphs Extended-B)
14D(Egyptian Hieroglyphs Extended-B)
14E(Egyptian Hieroglyphs Extended-B)
14F(Egyptian Hieroglyphs Extended-B)
150(Lampung)(Kerinci)???(Mandombe)
151(Mandombe)
152(Mandombe)
153(Mandombe)
154(Mandombe)
155¿Maya Hieroglyphs?
156¿Maya Hieroglyphs?
157¿Maya Hieroglyphs?
158¿Maya Hieroglyphs?
159¿Maya Hieroglyphs?
15A??????
15B??????
15C¿Aztec Pictograms?
15D¿Aztec Pictograms?
15E¿Aztec Pictograms?
15F¿Aztec Pictograms?
160(Cirth)(Tengwar)
161(Khema (Gurung))¿Khe Prih (Gurung)????(Moon)
162(Blissymbols)
163(Blissymbols)
164(Blissymbols)
165(Blissymbols)
166(Blissymbols)
167(Bagam)¿Iban?
168Bamum Supplement
169Bamum Supplement
16ABamum Suppl.Mro(Tangsa(Mossang))Bassa Vah
16BPahawh Hmong(Woleai)
16C(Kpelle)(Afaka)(Tangsa(Khimhun))
16D??????(Kulitan)
16E(Mwangwego)(Medefaidrin)(Buginese Supplement)
16FMiao¿Lontara bilang-bilang?Ideo.Sym&Punc.
170Tangut
171Tangut
172Tangut
173Tangut
174Tangut
175Tangut
176Tangut
177Tangut
178Tangut
179Tangut
17ATangut
17BTangut
17CTangut
17DTangut
17ETangut
17FTangut
180Tangut
181Tangut
182Tangut
183Tangut
184Tangut
185Tangut
186Tangut
187Tangut
188Tangut Components
189Tangut Components
18ATangut Components
18B(Khitan Small Script)
18C(Khitan Small Script)
18D¿Khit.Sm.Rad.?(Khitan Ideographs)
18E(Khitan Ideographs)
18F(Khitan Ideographs)
190(Khitan Ideographs)
191(Khitan Ideographs)
192(Khitan Ideographs)
193(Khitan Ideographs)
194(Khitan Ideographs)
195(Khitan Ideographs)
196(Jurchen)
197(Jurchen)
198(Jurchen)
199(Jurchen)
19A(Jurchen)
19B(Jurchen)(Jurchen Radicals)??????????????????
19C???
19D???
19E(Pau Cin Hau Syllabary)
19F(Pau Cin Hau Syllabary)
1A0(Pau Cin Hau Syllabary)
1A1(Pau Cin Hau Syllabary)
1A2(Pau Cin Hau Syllabary)
1A3(Eskaya)
1A4(Eskaya)
1A5(Eskaya)
1A6(Eskaya)
1A7(Eskaya)?????????
1A8¿Naxi Geba?
1A9¿Naxi Geba?
1AA¿Naxi Geba????(Naxi Dongba)
1AB(Naxi Dongba)
1AC(Naxi Dongba)
1AD(Naxi Dongba)
1AE(Naxi Dongba)
1AF(Naxi Dongba)
1B0Kana Supplement
1B1(Kana Ext.-A)¿Kaida?(Nushu)
1B2(Nushu)
1B3(Shuishu)
1B4(Shuishu)
1B5¿Proto-Elamite?
1B6¿Proto-Elamite?
1B7¿Proto-Elamite?
1B8¿Proto-Elamite?
1B9¿Proto-Elamite?
1BA¿Proto-Elamite?
1BB¿Proto-Elamite?
1BCDuployanShFC(Pitman Sh)
1BD¿Shorthands?
1BE¿Shorthands?
1BF¿Shorthands?
1C0¿Micmac Hieroglyphs?
1C1¿Micmac Hieroglyphs?
1C2¿Micmac Hieroglyphs?
1C3¿Micmac Hieroglyphs?
1C4¿Micmac Hieroglyphs?
1C5¿Micmac Hieroglyphs?
1C6¿Micmac Hieroglyphs?
1C7¿Micmac Hieroglyphs?
1C8¿Micmac Hieroglyphs?
1C9¿Micmac Hieroglyphs?
1CA¿Micmac Hieroglyphs?¿Rongorongo?
1CB¿Rongorongo?
1CC¿Rongorongo?
1CD¿Rongorongo?????????????
1CE??????
1CF??????
1D0Byzantine Musical Symbols
1D1Musical Symbols
1D2Anc. Greek Music. Notation????????????(Mayan Numerals)
1D3Tai Xuan Jing SymbolsRod Nums¿Mathematical Alphanumeric Symbols Supplement?
1D4Mathematical Alphanumeric Symbols
1D5Mathematical Alphanumeric Symbols
1D6Mathematical Alphanumeric Symbols
1D7Mathematical Alphanumeric Symbols
1D8Sutton SignWriting
1D9Sutton SignWriting
1DASutton SignWriting???????????????
1DB??????
1DC??????
1DD??????
1DE??????
1DF??????
1E0Glagolitic Supp.¿Pallava?¿Chalukya (Box-Headed)???????
1E1(Eebee Hmong)(Cher Vang Hmong)
1E2(Western Cham)¿Beria????
1E3(Loma)
1E4(Loma)??????
1E5??????
1E6??????
1E7??????
1E8Mende Kikakui??????
1E9Adlam?????????
1EA??????
1EB??????
1EC(Persian Siyaq Numbers)(Indic Siyaq Numbers)(Diwani Siyaq Numbers)
1ED(Ottoman Siyaq Numbers)????????????
1EEArabic Mathematical Alphabetic Symbols
1EF??????
1F0Mahjong TilesDomino TilesPlaying Cards
1F1Enclosed Alphanumeric Supplement
1F2Enclosed Ideographic Supplement
1F3Miscellaneous Symbols and Pictographs
1F4Miscellaneous Symbols and Pictographs
1F5Miscellaneous Symbols and Pictographs
1F6EmoticonsOrnamental DingbatsTransport and Map Symbols
1F7Alchemical SymbolsGeometric Shapes Extended
1F8Supplemental Arrows-C
1F9Supplemental Symbols and Pictographs
1FA??????
1FB??????
1FC??????
1FD??????
1FE??????
1FF??????


+ Recent posts