기타

한글 인코딩 정리 (문자체계와 인코딩)

띵유 2021. 11. 12. 20:52
반응형

멀티바이트, 유니코드, ANSI, 아스키, utf-8 온갖 용어들이 머릿속에서 정리가 안되어 여기에 정리해둔다.

 

아스키코드, 멀티바이트, 유니코드, ANSI  이 아이들은 문자 집합이다. 문자 표 라고도 불린다. 

이런 애들이다. 문자를 특정 숫자에 대응시켜서 나타내는 체계(표현방법) 라고 볼 수 있다.


그렇다면 utf-8, euc-kr, cp949,ISO 88859 이런 애들은 뭘까? 인코딩이다!

앞서 문자 집합 체계를 정했는데, 이를 컴퓨터로 표현하는 방법을 정하는 방식이다.

여기서 헷갈리는 포인트!
문차체계(ASCII, ANSI등)도 인코딩이 아닌가? 
-> 따지고보면 문자를 특정 숫자에 대응시켜 부호화했으니, 인코딩이라고 표현할 수 있겠지만
    엄밀히 말하면 인코딩한걸 한번 더 인코딩 한것이다. 
    " 문자 -> 코드 대응 -> binary로 표현 "
    
" 문자 -> 코드 대응(code) -> binary로 표현(인코딩) " 이 공식을 바탕으로 각 코드 체계별로 예시를 들어보자.
1) ASCII 문자체계
 문자 (A) -> 코드 대응 (0x41) -> binary  ISO-8859-1 (01000001)

                                                      ISO-8859-15 (01000001)

 문자 (€) -> 코드 대응 (0x20ac) -> binary  ISO-8859-1 (00111111)

                                                       ISO-8859-15 (10100100)

A를 보면 잘 감이 안오겠지만 문자 € 를 보면 알 수 있다. 
ASCII 코드 표상으로는 같은 코드에 대응하지만 ISO-8859-1, ISO-8859-15 와 같이 인코딩 방식에 따라 실제 저장되는 방식이 다른 것이다.

2) UNICODE 문자체계
문자 (A) -> 코드 대응(0x41) -> binary UTF-8 (01000001)
                                                    UTF-16 (0000000001000001)

문자 (€) -> 코드 대응 (0x20ac) -> binary  UTF-8(111000101000001010101100)

                                                      UTF-16 (0010000010101100)

문자 (가) -> 코드 대응(0xac00) -> binary UTF-8 (111010101011000010000000)
                                                        UTF-16 (1010110000000000)

코드 체계가 달라도 문자가 같다면 같은 숫자를 부여받았다. 그러나 이건 편의를 위해 이렇게 지정한것일뿐.
원칙상으로는 A를 ASCII에서는 65, UNICODE에서는 1 로 지정해도 관계가 없다. 다만 이렇게 하면 혼란이 가중되기때문에 처음 만든 사람들이 통일한것일뿐...

 

 


유니코드와 UTF-8

 

유니코드와  UTF-8 의 경우를 설명할텐데, 그전에 유니코드 이전의 문자 표현 체계부터 살펴보자.

유니코드 이전에 아스키코드라는 체계가 있었다. 7bit로 영어만 표현하는 체계였다. 
하지만 다른 나라 문자도 표현해야했고 이를 위해 멀티바이트라는 체계도 만들었다.
멀티바이트라는 이름에서 알 수 있듯이 바이트 수가 달라 어려움이 많았다.

그래서 나온 것이 유니코드는 16bit(2byte)로 전세계의 모든 문자를 표현하기로 한 체계이다.

자, 이제 모든 문서를 저장할때 유니코드를 따르도록 약속했다고 하자.
유니코드의 인코딩 형식 중 UTF-8 형식이 있다. UTF-8은 가변 길이 문자인코딩 방식으로 1byte ~ 4byte사이로 문자를 인코딩한다.


예를들어 Python 이라는 문자를 저장하려고 할 때 무조건 4byte로 고정하는 인코딩 방식이라면 아래와 같이 인코딩해야한다.
  P                     y               t                   h                   o                   n              
0x50 00 00 00 00 79 00 00 00 74 00 00 00 00 68 00 00 00 00 6f 00 00 00 00 63 00 00 00 00


00이 쓸데없이 많이 저장되어있다. 이러한 공간 낭비를 줄이기 위해서 UTF-8에서는 가변길이를 채택한다.

바이트 수  바이트1 바이트 2 바이트 3  바이트 4
1 0xxxxxxxx      
2 110xxxxx 10xxxxxx    
3 1110xxxx 10xxxxxx 10xxxxxx  
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

이 표와 같이 바이트의 초기 숫자를 통해서 몇 바이트로 표현할 것인지 결정한다.

 

 

참고 )

아스키코드(영어만- 7bit) <- 인코딩 방식(ISO~~)
ANSI(아스키코드 + 코드 페이지(언어) 마다 코드표가 따로 있음) <- 코드표에따라 나뉨(euc-kr, cp949)

멀티바이트(타국가 추가 but 바이트수가 다름) <- 인코딩 방식(~~)
유니코드(타 국가 추가 and 바이트 수 같음) <- 인코딩 방식(utf - 8 : 영어1, 한글3 byte 수 다르게) 


요약

1) 최초에는 문자를 모두 1byte(7bit) 에 표현했다. 아스키코드라고 한다. 7bit를 사용하다보니 영문외에는 표현하지 못하는 문자가 생김.
2) 다른 문자도 표현하기위해 멀티바이트로 표현함. (멀티바이트란 영문은 1byte, 1바이트로 표현못하는 문자는 2byte. ex한글)
3) 문자마다 바이트가 달라 일관성이 없음. 그래서 생겨난 것이 유니코드(모든 문자가 2byte)

4) 유니코드를 사용하다보니, 영문은 7bit만 있어도 되는데 2byte나 쓰니 비효율 적임. 그래서 가변문자 인코딩(utf-8)을 도입
=> 유니코드를 인코딩하는 방식에 따라 여러가지로 나뉨(utf-8, utf-16, euc-kr)
  즉, 유니코드 숫자 자체는 똑같지만 어떻게 표현할 것인지에 따라 다른것
   ex) 문자 (가) -> 유니코드 (0xac00) -> binary UTF-8 (111010101011000010000000)
                                                                         UTF-16 (1010110000000000)

반응형