본문 바로가기

한글

by iseohyun [2023. 4. 30.]

3줄요약

  • 옛날에는 메모리상의 문제로 한글판 문자열(EUC-KR)을 썼었다.
  • 지금은 모든 나라 언어를 한 화면(또는 시스템)에서 다룰 수 있는 유니코드(Unicode)를 쓴다.
  • 코딩으로 살펴보니 아직도 window에서는 EUC-KR을 사용하고 있다.

 

한글의 구성

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

 

세계속의 한글

한글 자음/모음에 옛자, 죽은 글자까지 포함되어 있다. 가장 빈도높게 사용되는 영역은 한글 음절을 담은 영역이다. 11184는 19 * 21 * 28 = 11172를 포함하는 16배수에서 왔다.
하지만, 표현할 수 있는 한글 전체를 담은 유니코드와는 달리 옛날에는 메모리상의 문제로 필요하다라고 판단되는 글자(8822글자)만 추려서 글자를 표현혔다.
더보기

 

  0 1 2 3 4 5 6 7 8 9 A B C D E F
   
 
 
 
 
   
   
 
  굿
  귿
 
   
   
 
  꼿
 
  뀀
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
  릿
 
 
 
   
   
 
  믿
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
  퀀  
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   
   
 
 
 
 
   

 

이와 같은 저장방식은 다음과 같은 문제를 일으켰다.

  • 정상적으로 사용되는 글자가 포함되지 않았다. [김설믜][으쌰으쌰->으?으?]
  • 번역기 등 한 페이지에 '한글'과 '일본어', '아랍어' 등 표시 할 수 없었다. (※ 중국어는 포함되어 있음)

 

코드로 확인하기

아직도 VS코드에는 euc-kr을 사용하는 것을 알 수 있다.

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 : 낢 남 납 낫 났 낭 낮 낯 낱 낳 내 낵 낸 낼 냄 냅

물론 유니코드를 출력하려면 얼마든지 출력이 가능하다.

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  /

 

유니코드 출력하기

출력방법은 의외로 간단하다 /u#### 형식으로 작성하면 된다. ####에 유니코드를 입력하면 된다. 물론 해당 유니코드로 출력하더라도 메모리상에는 여전히 EUC-KR로 작성되어 있다는 것이다. 자동으로 수행하는 기능이기 때문에 크게 문제가 없을 수도 있으나, 오름차순/내림차순을 직접 구현해야 하는 입장이라면 꽤나 머리아플 작업이 될 것이다.

//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 : 각갂갃간

 

댓글