한글의 구성

조합가능한 한글의 총 갯수는 11172(= 19 x 21 x 28)개 입니다.

글자 갯수
종류 갯수 구성
자음 14 ㄱㄴㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ
모음 10 ㅏㅑㅓㅕㅗㅛㅜㅠㅡㅣ
겹자음 5 ㄲㄸㅃㅆㅉ
겹받침 13 ㄲㄳㄵㄶㄺㄻㄼㄽㄾㄿㅀㅄㅆ
겹모음 11 ㅐㅒㅔㅖㅘㅙㅚㅝㅞㅟㅢ
초성, 중성, 종성
위치 구성 순서(오름차순)
초성(19) 자음(14) + 겹자음(5) ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
중성(21) 모음(10) + 겹모음(11) ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
종성(28) 없음(1) + 자음(14) + 겹받침(13) (x) ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ

유니코드

유니코드(Unicode)는 문자열 코드의 일종입니다. 유니코드는 전세계 모든 문자를 숫자와 1:1 대응하여 관리합니다. 영문과 일부 기호를 관리하는 코드는 ascii코드입니다.

Hangul Jamo
0 1 2 3 4 5 6 7 8 9 a b c d e f
0x110
0x111
0x112
0x113
0x114
0x115
0x116
0x117
0x118
0x119
0x11a
0x11b
0x11c
0x11d
0x11e
0x11f
Hangul Compatibility Jamo
0 1 2 3 4 5 6 7 8 9 a b c d e f
0x313
0x314
0x315
0x316
0x317
0x318
Hangul Jamo Extended-A
0 1 2 3 4 5 6 7 8 9 a b c d e f
0xa96
0xa97 ꥿
Hangul Syllables(11172글자) 열기(테이블이 너무 큽니다.)
Hangul Syllables
0 1 2 3 4 5 6 7 8 9 a b c d e f
0xac0
0xac1
0xac2
0xac3 갿
0xac4
0xac5
0xac6
0xac7 걿
0xac8
0xac9
0xaca
0xacb 겿
0xacc
0xacd
0xace
0xacf 곿
0xad0
0xad1
0xad2
0xad3 괿
0xad4
0xad5
0xad6
0xad7 굿
0xad8
0xad9
0xada
0xadb 궿
0xadc
0xadd
0xade
0xadf 귿
0xae0
0xae1
0xae2
0xae3 긿
0xae4
0xae5
0xae6
0xae7 깿
0xae8
0xae9
0xaea
0xaeb 꺿
0xaec
0xaed
0xaee
0xaef 껿
0xaf0
0xaf1
0xaf2
0xaf3 꼿
0xaf4
0xaf5
0xaf6
0xaf7 꽿
0xaf8
0xaf9
0xafa
0xafb 꾿
0xafc
0xafd
0xafe
0xaff 꿿
0xb00 뀀
0xb01
0xb02
0xb03
0xb04
0xb05
0xb06
0xb07
0xb08
0xb09
0xb0a
0xb0b
0xb0c
0xb0d
0xb0e
0xb0f
0xb10
0xb11
0xb12
0xb13
0xb14
0xb15
0xb16
0xb17
0xb18
0xb19
0xb1a
0xb1b
0xb1c
0xb1d
0xb1e
0xb1f
0xb20
0xb21
0xb22
0xb23
0xb24
0xb25
0xb26
0xb27
0xb28
0xb29
0xb2a
0xb2b
0xb2c
0xb2d
0xb2e
0xb2f
0xb30
0xb31
0xb32
0xb33
0xb34
0xb35
0xb36
0xb37
0xb38
0xb39
0xb3a
0xb3b
0xb3c
0xb3d
0xb3e
0xb3f
0xb40
0xb41
0xb42
0xb43
0xb44
0xb45
0xb46
0xb47
0xb48
0xb49
0xb4a
0xb4b
0xb4c
0xb4d
0xb4e
0xb4f
0xb50
0xb51
0xb52
0xb53
0xb54
0xb55
0xb56
0xb57
0xb58
0xb59
0xb5a
0xb5b
0xb5c
0xb5d
0xb5e
0xb5f
0xb60
0xb61
0xb62
0xb63
0xb64
0xb65
0xb66
0xb67
0xb68
0xb69
0xb6a
0xb6b
0xb6c
0xb6d
0xb6e
0xb6f
0xb70
0xb71
0xb72
0xb73
0xb74
0xb75
0xb76
0xb77
0xb78
0xb79
0xb7a
0xb7b
0xb7c
0xb7d
0xb7e
0xb7f
0xb80
0xb81
0xb82
0xb83
0xb84
0xb85
0xb86
0xb87
0xb88
0xb89
0xb8a
0xb8b
0xb8c
0xb8d
0xb8e
0xb8f
0xb90
0xb91
0xb92
0xb93 뤿
0xb94
0xb95
0xb96
0xb97 륿
0xb98
0xb99
0xb9a
0xb9b 릿
0xb9c
0xb9d
0xb9e
0xb9f 맿
0xba0
0xba1
0xba2
0xba3 먿
0xba4
0xba5
0xba6
0xba7 멿
0xba8
0xba9
0xbaa
0xbab 몿
0xbac
0xbad
0xbae
0xbaf 뫿
0xbb0
0xbb1
0xbb2
0xbb3 묿
0xbb4
0xbb5
0xbb6
0xbb7 뭿
0xbb8
0xbb9
0xbba
0xbbb 뮿
0xbbc
0xbbd
0xbbe
0xbbf 믿
0xbc0
0xbc1
0xbc2
0xbc3 밿
0xbc4
0xbc5
0xbc6
0xbc7 뱿
0xbc8
0xbc9
0xbca
0xbcb 벿
0xbcc
0xbcd
0xbce
0xbcf 볿
0xbd0
0xbd1
0xbd2
0xbd3 봿
0xbd4
0xbd5
0xbd6
0xbd7 뵿
0xbd8
0xbd9
0xbda
0xbdb 붿
0xbdc
0xbdd
0xbde
0xbdf 뷿
0xbe0
0xbe1
0xbe2
0xbe3 븿
0xbe4
0xbe5
0xbe6
0xbe7 빿
0xbe8
0xbe9
0xbea
0xbeb 뺿
0xbec
0xbed
0xbee
0xbef 뻿
0xbf0
0xbf1
0xbf2
0xbf3 뼿
0xbf4
0xbf5
0xbf6
0xbf7 뽿
0xbf8
0xbf9
0xbfa
0xbfb 뾿
0xbfc
0xbfd
0xbfe
0xbff 뿿
0xc00 쀀
0xc01
0xc02
0xc03
0xc04
0xc05
0xc06
0xc07
0xc08
0xc09
0xc0a
0xc0b
0xc0c
0xc0d
0xc0e
0xc0f
0xc10
0xc11
0xc12
0xc13
0xc14
0xc15
0xc16
0xc17
0xc18
0xc19
0xc1a
0xc1b
0xc1c
0xc1d
0xc1e
0xc1f
0xc20
0xc21
0xc22
0xc23
0xc24
0xc25
0xc26
0xc27
0xc28
0xc29
0xc2a
0xc2b
0xc2c
0xc2d
0xc2e
0xc2f
0xc30
0xc31
0xc32
0xc33
0xc34
0xc35
0xc36
0xc37
0xc38
0xc39
0xc3a
0xc3b
0xc3c
0xc3d
0xc3e
0xc3f
0xc40
0xc41
0xc42
0xc43
0xc44
0xc45
0xc46
0xc47
0xc48
0xc49
0xc4a
0xc4b
0xc4c
0xc4d
0xc4e
0xc4f
0xc50
0xc51
0xc52
0xc53
0xc54
0xc55
0xc56
0xc57
0xc58
0xc59
0xc5a
0xc5b
0xc5c
0xc5d
0xc5e
0xc5f
0xc60
0xc61
0xc62
0xc63
0xc64
0xc65
0xc66
0xc67
0xc68
0xc69
0xc6a
0xc6b
0xc6c
0xc6d
0xc6e
0xc6f
0xc70
0xc71
0xc72
0xc73
0xc74
0xc75
0xc76
0xc77
0xc78
0xc79
0xc7a
0xc7b
0xc7c
0xc7d
0xc7e
0xc7f
0xc80
0xc81
0xc82
0xc83
0xc84
0xc85
0xc86
0xc87
0xc88
0xc89
0xc8a
0xc8b
0xc8c
0xc8d
0xc8e
0xc8f
0xc90
0xc91
0xc92
0xc93 줿
0xc94
0xc95
0xc96
0xc97 쥿
0xc98
0xc99
0xc9a
0xc9b 즿
0xc9c
0xc9d
0xc9e
0xc9f 짿
0xca0
0xca1
0xca2
0xca3 쨿
0xca4
0xca5
0xca6
0xca7 쩿
0xca8
0xca9
0xcaa
0xcab 쪿
0xcac
0xcad
0xcae
0xcaf 쫿
0xcb0
0xcb1
0xcb2
0xcb3 쬿
0xcb4
0xcb5
0xcb6
0xcb7 쭿
0xcb8
0xcb9
0xcba
0xcbb 쮿
0xcbc
0xcbd
0xcbe
0xcbf 쯿
0xcc0
0xcc1
0xcc2
0xcc3 찿
0xcc4
0xcc5
0xcc6
0xcc7 챿
0xcc8
0xcc9
0xcca
0xccb 첿
0xccc
0xccd
0xcce
0xccf 쳿
0xcd0
0xcd1
0xcd2
0xcd3 촿
0xcd4
0xcd5
0xcd6
0xcd7 쵿
0xcd8
0xcd9
0xcda
0xcdb 춿
0xcdc
0xcdd
0xcde
0xcdf 췿
0xce0
0xce1
0xce2
0xce3 츿
0xce4
0xce5
0xce6
0xce7 칿
0xce8
0xce9
0xcea
0xceb 캿
0xcec
0xced
0xcee
0xcef 컿
0xcf0
0xcf1
0xcf2
0xcf3 켿
0xcf4
0xcf5
0xcf6
0xcf7 콿
0xcf8
0xcf9
0xcfa
0xcfb 쾿
0xcfc
0xcfd
0xcfe
0xcff 쿿
0xd00 퀀
0xd01
0xd02
0xd03
0xd04
0xd05
0xd06
0xd07
0xd08
0xd09
0xd0a
0xd0b
0xd0c
0xd0d
0xd0e
0xd0f
0xd10
0xd11
0xd12
0xd13
0xd14
0xd15
0xd16
0xd17
0xd18
0xd19
0xd1a
0xd1b
0xd1c
0xd1d
0xd1e
0xd1f
0xd20
0xd21
0xd22
0xd23
0xd24
0xd25
0xd26
0xd27
0xd28
0xd29
0xd2a
0xd2b
0xd2c
0xd2d
0xd2e
0xd2f
0xd30
0xd31
0xd32
0xd33
0xd34
0xd35
0xd36
0xd37
0xd38
0xd39
0xd3a
0xd3b
0xd3c
0xd3d
0xd3e
0xd3f
0xd40
0xd41
0xd42
0xd43
0xd44
0xd45
0xd46
0xd47
0xd48
0xd49
0xd4a
0xd4b
0xd4c
0xd4d
0xd4e
0xd4f
0xd50
0xd51
0xd52
0xd53
0xd54
0xd55
0xd56
0xd57
0xd58
0xd59
0xd5a
0xd5b
0xd5c
0xd5d
0xd5e
0xd5f
0xd60
0xd61
0xd62
0xd63
0xd64
0xd65
0xd66
0xd67
0xd68
0xd69
0xd6a
0xd6b
0xd6c
0xd6d
0xd6e
0xd6f
0xd70
0xd71
0xd72
0xd73
0xd74
0xd75
0xd76
0xd77
0xd78
0xd79
0xd7a
Hangul Jamo Extended-B
0 1 2 3 4 5 6 7 8 9 a b c d e f
0xd7b
0xd7c
0xd7d
0xd7e
0xd7f

코덱

코덱(codec)은 순수 데이터(row data)를 가공하는 기술로, 문자열 코덱, 이미지 코덱, 동영상 코덱, 압축 코덱 등이 존재합니다.

문자열 코덱의 이유는 코드북(예: ascii, unicode)의 확장 가능성이나 선별 등의 이유로 설계됩니다. 컴퓨터가 숫자를 만났을 때, 바로 코드북과 비교하는 것이 아니라, 어떤 코덱으로 디코딩을 수행 한 뒤, 결과물을 코드북에서 찾아서 출력하게 됩니다.

EUC-KR

2 byte의 정보에 코덱 정보를 넣어 2 byte정보를 넣을 수는 없습니다. 따라서 EUC-KR은 사용하지 않을 것 같은 글자(2,350자)를 빼고, 8,822글자만 표현하게 됩니다. 다음은 C코드로 숫자를 생성 한 뒤, 윈도우 전용 터미널을 통해서 출력한 결과입니다.

char p = 0xb0;
char q = 0xa1;
for (int i = 0; i < 20; i++) {
  printf("%02X%02X : ", p & 0xFF, q & 0xFF);
  for (int j = 0; j < 16; j++) {
    printf("%c%c ", p, q++);
    if (!q) {
      p++;
      q = 0xA0;
    }
  }
  printf("\n");
}
  B0A1 : 가 각 간 갇 갈 갉 갊 감 갑 값 갓 갔 강 갖 갗 같
  B0B1 : 갚 갛 개 객 갠 갤 갬 갭 갯 갰 갱 갸 갹 갼 걀 걋
  B0C1 : 걍 걔 걘 걜 거 걱 건 걷 걸 걺 검 겁 것 겄 겅 겆
  B0D1 : 겉 겊 겋 게 겐 겔 겜 겝 겟 겠 겡 겨 격 겪 견 겯
  B0E1 : 결 겸 겹 겻 겼 경 곁 계 곈 곌 곕 곗 고 곡 곤 곧
  B0F1 : 골 곪 곬 곯 곰 곱 곳 공 곶 과 곽 관 괄 괆 ? 콬
  B1A1 : 괌 괍 괏 광 괘 괜 괠 괩 괬 괭 괴 괵 괸 괼 굄 굅
  B1B1 : 굇 굉 교 굔 굘 굡 굣 구 국 군 굳 굴 굵 굶 굻 굼
  B1C1 : 굽 굿 궁 궂 궈 궉 권 궐 궜 궝 궤 궷 귀 귁 귄 귈
  B1D1 : 귐 귑 귓 규 균 귤 그 극 근 귿 글 긁 금 급 긋 긍
  B1E1 : 긔 기 긱 긴 긷 길 긺 김 깁 깃 깅 깆 깊 까 깍 깎
  B1F1 : 깐 깔 깖 깜 깝 깟 깠 깡 깥 깨 깩 깬 깰 깸 ? 쿋
  B2A1 : 깹 깻 깼 깽 꺄 꺅 꺌 꺼 꺽 꺾 껀 껄 껌 껍 껏 껐
  B2B1 : 껑 께 껙 껜 껨 껫 껭 껴 껸 껼 꼇 꼈 꼍 꼐 꼬 꼭
  B2C1 : 꼰 꼲 꼴 꼼 꼽 꼿 꽁 꽂 꽃 꽈 꽉 꽐 꽜 꽝 꽤 꽥
  B2D1 : 꽹 꾀 꾄 꾈 꾐 꾑 꾕 꾜 꾸 꾹 꾼 꿀 꿇 꿈 꿉 꿋
  B2E1 : 꿍 꿎 꿔 꿜 꿨 꿩 꿰 꿱 꿴 꿸 뀀 뀁 뀄 뀌 뀐 뀔
  B2F1 : 뀜 뀝 뀨 끄 끅 끈 끊 끌 끎 끓 끔 끕 끗 끙 ? 퀬
  B3A1 : 끝 끼 끽 낀 낄 낌 낍 낏 낑 나 낙 낚 난 낟 날 낡
  B3B1 : 낢 남 납 낫 났 낭 낮 낯 낱 낳 내 낵 낸 낼 냄 냅

EUC-KR의 이러한 결정은 훗날 '아헤헿', '뷁' 등 표현 할 수 없는 문자들로 인해 고통받게 됩니다. 실제로 이러한 단어들의 코드를 출력해보면, '갂', '갃'등의 코드범위가 다름을 확인 할 수 있습니다.

char hangle[31] = "가각갂갃간개객갞갟갠까깍깎깏깐";
printf("%s\n", hangle);
for (int i = 0; i < 30; i++) {
  printf("%02X ", * (hangle + i) & 0xFF);
  if (i % 2)
    printf(" / ");
  if (!((i+1) % 10))
    printf("\n");
}
char16_t c = 0xAC00;
printf("%s\n", (char *) & c);
  가각갂갃간개객갞갟갠까깍깎깐
  B0 A1  / B0 A2  / 81 41  / 81 42  / B0 A3  /
  B0 B3  / B0 B4  / 81 4B  / 81 4C  / B0 B5  /
  B1 EE  / B1 EF  / B1 F0  / 83 8A  / B1 F1  /

Unicode출력

C코드에서 출력하는 방법

//EUC-KR : 각(B0A2 : 1011 0000 1010 0010)
//유니코드 : 각(AC01 : 1010 1100 0000 0001)

char16_t c[5] = { 0xA2B0, 0x4181, 0x4281, 0xA3B0, 0 };
printf("EUC-KR   : %s\n", (char*)&c);

char str[10] = "\uac01\uac02\uac03\uac04";
printf("Uni-Code : %s\n", str);
EUC-KR   : 각갂갃간
Uni-Code : 각갂갃간
각갂갃간의 실제 메모리 로드 "euckr_memory.png", @iseohyun.com, ⓒpublic

웹에서 유니코드 표현하는 방법

특수문자는 '&[#숫자 또는 예약어];'형식입니다. 예를들어, 띄어쓰기는 &nbsp;거나 &#160; 또는 &#xA0;(160은 16진수로 'A0'이다)로 표현 할 수 있습니다. 같은 원리로 '가'를 출력하기 위해서는 &#xac00;을 입력하면 됩니다.

예약어에 대한 자세한 설명은 여기를 참고하십시오.

직접 코드페이지를 작성하고 싶다면 아래 python코드가 도움이 될지 모릅니다.

start = 0x1100
end = 0x11FF
cur = start
file = "out.txt"
with open(file, "w+", encoding="utf8") as f:
    for i in range((end - start) // 16 + 1):
        f.write(f"\n0x{cur//16:x}")
        for i in range(16):
            f.write(f"&#x{cur:x};")
            cur += 1

결론

UTF-8 씁시다.