Notice
Recent Posts
Recent Comments
Today
Total
05-02 20:39
Archives
관리 메뉴

Jeongchul Kim

한글 인코딩과 변환 코딩 본문

정보검색-데이터마이닝

한글 인코딩과 변환 코딩

김 정출 2016. 10. 15. 21:35


 

한글 인코딩과 변환 코딩

한글 인코딩

uuencode, uudecode

8비트 3문자를 6비트 4문자로 변경한다.

UUE : 3Byte의 Binary Data -> 4Byte의 Text Data

1. 16진수

0x14 0x0F 0xA8


2. 2진수

00010100 00001111 10101000 -> 8bit * 3


3. 6개씩 끊기

000101 000000 111110 101000 -> 6bit * 4


4. 상위 비트 앞에 00추가

00000101 00000000 00111110 00101000


5. 16진수로 변환

0x05 0x00 0x3E 0x28


6. 이 숫자에 0x20 더함 (예외 0인 경우 0x00 -> 0x60)

0x25 0x60 0x5E 0x48


7. 최종

%`^H


Base64

8비트 3문자를 6비트 4문자로 변경한다.

Base table : 2^6 = 64개로 맵핑

끝 부분의 padding(=)으로 Base64 식별


인코딩의 예

H A C

(한 문자당 8bit 24bit)

1. 2비트로 표현한다. (8*3 = 24)

01001000 0100001 01000011


2. 6개로 나눈다 (6*4 = 24)

010010 000100 000101 00011


3. 10진수로 표기한다.

18 4 5 3


4. BaseTable에  각 인덱스에 맞는 값으로 변경한다.

S E F D


5. [padding] bit % 3 == number of p

SEFD


QP 변환

한글 코드 값은 그대로 표현 앞에 padding(=)을 붙여준다.

가 -> =B0=A1

안녕하세요 -> =BE=C8=B3=E7=C7=CF=BC=BC=BF=E4


ISO 2022-KR

한글 시작 표시함을 알림 <ESC>$)C

<SO>, <SI> 사이에 한글

MSB를 0으로 Setting


변환 코딩

ASCII 코드 출력과 KS 완성형 코드 한글 출력

int i, j;

for (i=27; i < 128; i++) {  // ASCII

printf("\t%c : 0x%x\n", i, i);

}

for (i=0xB0; i <= 0xC8; i++) {   // KS 완성형 한글 코드

for (j=0xA1; j <= 0xFE; j++) {

printf("%c%c : 0x%x%x\n", i, j, i, j);

}

}


영문자 빈도 조사

int alphabet[26]; Alphabet[26];

int ch = getchar();

while(ch != '\n') {

if(ch >= 'A' && ch <= 'Z')

Alphabet[ch-'A']++;

else if(ch >= 'a' && ch <= 'z')

alphabet[ch-'a']++;

else

printf("This is not Alphabet\n");

}

for(i=0;i<26;i++)

printf("%c : %d, %c : %d\n",'A'+i,Alphabet[i],'a'+i,alphabet[i]);


한글 빈도 조사

int hangul[25][94] = {0};

int c1,c2;

c1 = getchar();

while(c1 != '\n') {

if(c1 >= 0xB0 && c1 <= 0xC8) {

c2 = getchar();

if(c2 >= 0xA1 && c2 <= 0xFE)

hangul[c1-0xB0][c2-0xA1]++;

}

}

int i,j;

for(i=0;i<25;i++)

for(j=0;j<94;j++)

if(hangul[i][h])

printf("%c%c : %d\n",0xB0+i,0xA1+j, hangul[i][j]);


UTF-8 한글 출력

#include <stdio.h>

int main() {

int i, j;

FILE *fp;

char utf8[4]={0};

fp = fopen("out.txt", "w");

fprintf(fp, "%c%c", 0xFE, 0xFF);

for (i=0xAC00, j=0; j < 11172; i++, j++) {

utf8[0] = 0xE0; utf8[0] |= ((i >> 12) & 0x000F);

utf8[1] = 0x80; utf8[1] |= ((i >> 6) & 0x003F);

utf8[2] = 0x80; utf8[2] |= (i & 0x003F);

fprintf(fp, "%s", utf8);

fprintf(fp, ": 0x%x \n", i);

}

fclose(fp);

puts("FIle <out.txt> has been created!");

return 0;

}


Unicode <-> UTF-8 변환


#include <stdio.h>

int uni2utf8(int uni)

{

int utf;

utf = 0x00E00000 | (uni << 4) & 0x000F0000;

utf |= 0x00008000 | (uni << 2) & 0x00003F00;

utf |= 0x00000080 | uni & 0x0000003F;

return utf;

}

int utf2uni(int utf)

{

int uni;

uni = utf & 0x0000003F; // last 6 bits in 3rd byte

uni |= ((utf & 0x00003F00) >> 2); // 6 bits in 2nd byte

uni |= ((utf & 0x000F0000) >> 4); // 4 bits in 1st byte

return uni;

}

// return value: 0~18

int chosung_index(int uni)

{

return ((uni-0x0000AC00) / (21*28));

}

// return value: 0~20

int jungsung_index(int uni)

{

return ((uni-0x0000AC00) % (21*28)) / 28;

}

// return value: 0~27

int jongsung_index(int uni)

{

return ((uni-0x0000AC00) % 28);

}

main()

{

int uni=0xC704; // '위'

int utf;

int cho, jung, jong;

char str[4];

utf = uni2utf8(uni); // unicode -> utf-8 conversion

printf("\tutf: 0x%x\n", utf);

uni = utf2uni(utf); // unicode -> utf-8 conversion

printf("\tuni: 0x%x\n", uni);

cho = chosung_index(uni);

jung= jungsung_index(uni);

jong= jongsung_index(uni);

printf("cho = %d\n", cho);

printf("jung= %d\n", jung);

printf("jong= %d\n", jong);

}





'정보검색-데이터마이닝' 카테고리의 다른 글

Stemming  (0) 2016.10.16
정보 검색 개요  (0) 2016.10.16
유니코드 Unicode  (0) 2016.10.15
한글 코드  (1) 2016.10.15
Comments